当前位置: 首页 > news >正文

sam9x60 USB驱动适配(二)

前文最后说到代码能编译却不能跑。通过单步调试的笨方法查看(毕竟是刚添加usb host layer就跑不动,首先就该怀疑它的初始化嘛)
发现是运行到tpl list初始化的for循环时出错了,第二次运行的时候就卡死了。暂停调试就直接跳到了data_abort_irq_handler。
for 循环的data abort 错误,当然是考虑越界了。那就看看递增上限 hostObj->nTPLEntries 的配置。

 /* Initialize all drivers in TPL List */
for ( tplEntryCount = 0 ; tplEntryCount < hostObj->nTPLEntries ; tplEntryCount++ )
{
tplEntry = &(hostObj->tpl[tplEntryCount]);
(( USB_HOST_CLIENT_DRIVER *)tplEntry->hostClientDriver)->initialize( tplEntry->hostClientDriverInitData );
}

其实就在for循环前面就有一句赋值行为。

hostObj->tpl = hostInit->tplList ;
hostObj->nTPLEntries = (int8_t)hostInit->nTPLEntries;

而 hostInit 的赋值在这整个初始化函数的开头

hostInit = ( USB_HOST_INIT * ) initData ;

而这个initdata的传参,是在initialize.c文件里面给进去的。

sysObj.usbHostObject0 = USB_HOST_Initialize (( SYS_MODULE_INIT *)& usbHostInitData );    

usbHostInitData 这个东西就是罪魁祸首。真正应该先做检查再确定数量的地方是这个结构体的成员 nTPLEntries 。

const USB_HOST_INIT usbHostInitData = 
{.nTPLEntries = 3,  // 错误:应该是1.tplList = (USB_HOST_TPL_ENTRY *)USBTPList,.hostControllerDrivers = (USB_HOST_HCD *)&hcdTable    
};

在 d:/project/FT5426G/src/config/default/usb_host_init_data.c 文件中,
定义了一个TPL(Target Peripheral List)数组 USBTPList[3] ,但实际上只初始化了第一个元素(用于MSD类驱动):

static const USB_HOST_TPL_ENTRY USBTPList[3] = 
{TPL_INTERFACE_CLASS_SUBCLASS_PROTOCOL(USB_MSD_CLASS_CODE, USB_MSD_SUBCLASS_CODE_SCSI_TRANSPARENT_COMMAND_SET, USB_MSD_PROTOCOL, NULL,  USB_HOST_MSD_INTERFACE),// 其余两个元素未初始化
};

可以理解,tpl的全称是 Target Peripheral List 。这个结构体里一般会添加msd(U盘),cdc(usb接口外设)等不同类型的usb接口设备的驱动入口。
但是你直接默认3个不做检查,却又要让我自己添加3个就离谱,万一我不止3个那不还是报错。
而且我回头在mplab的mcc里面找了下,tpl entry数量直接灰色的3,不让更改。what?我还得在代码文件里改,以后每次mcc有所改动并生成代码的时候,都得手动跳过这个冲突以免覆盖。

这就导致在前面提到的 for 循环中,当 tplEntryCount 增加到1和2时,程序尝试访问未初始化的内存,从而触发了 data_abort 异常。
离谱的是它这里就没被编译器发现,这个xc32编译器真是神一下鬼一下的。

http://www.jsqmd.com/news/123676/

相关文章:

  • 自研AI平台的破局之道,如何成功转型企业级AIOS,只为落地而生
  • 噬菌体展示肽库的分类体系与核心特征
  • 【稀缺资源】AutoGLM-Phone-9B模型离线部署教程:仅需3步实现手机端AI推理
  • 效率提升测试工具开发的思考
  • 基因数据处理进入AI时代:Open-AutoGLM集成大模型带来的3大颠覆性变革
  • C 語言工程師笑我們慢?用模板元編程生成比他們快 10 倍的程式碼
  • 【Java毕设全套源码+文档】基于springboot的拍卖行系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 2025全场景商用咖啡机选购指南:大型企业办公室、咖啡、餐饮、茶饮连锁、便利店适用机型推荐 - 品牌2026
  • Open-AutoGLM落地实践全攻略(社区智能联动新范式)
  • 为什么顶尖文创团队都在用Open-AutoGLM?真相令人震惊
  • RockyLinux创建systemd定时器(手把手教你用systemd timer替代cron实现Linux定时任务)
  • 2025-2026年实验磨粉机找哪家?从信誉到售后全解析,教你挑到高性价比款 - 品牌推荐大师1
  • 为什么顶尖海洋实验室都在用Open-AutoGLM?(90%团队忽略的核心优势)
  • 硬核!大模型开发必备!T2A检索技术让工具调用效率暴涨28%,代码示例详解
  • 搜下代码中使用这两个结构体的地方,解释下这两个结构体具体使用场景和定位
  • 2025年喷涂陶瓷涂层企业权威推荐榜单:金属表面喷涂陶瓷釉/等离子陶瓷喷涂/陶瓷板喷涂源头厂家精选 - 品牌推荐官
  • 【Java毕设源码分享】基于springboot+vue的的拍卖行系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 同质化迷局:AI绘画为何难以逃脱风格贫困?
  • 基因数据处理新纪元(Open-AutoGLM实战指南)
  • Jmeter——循环控制器中实现Counter计数器的次数重置
  • [cs2] 一个文件搞定设置 - autoexec.cfg
  • 2023 级课堂测试试卷—数据分析
  • 2025年12月涂装线生产,静电喷涂线,涂装线设备公司推荐:涂装产线测评与选择指南 - 品牌鉴赏师
  • 2025年12月气模水上闯关,气模城堡,气模滑梯厂家公司推荐:充气游乐行业测评与选择指南 - 品牌鉴赏师
  • 北京海淀靠谱交通事故律师事务所排行榜(2025-2026公正测评)专业测评与性价比 - 苏木2025
  • 【独家披露】国家极地项目背后的AI引擎:Open-AutoGLM是如何做到全天候稳定的?
  • GitHub 一周热门项目速览 | 2025年12月22日
  • 极地科考AI部署难题,如何用Open-AutoGLM实现零故障运行?
  • 【Java毕设源码分享】基于springboot+vue的的学生作业管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • URI和URL的区别