Other Parts Discussed in Thread: SYSBIOS
Thread 中讨论的其他器件:SYSBIOS
工具/软件:TI-RTOS
您好!
我使用 CCS 7.2、TI 编译器17.9、BIOS 6.46.5.55作为我的环境。
我正在尝试使用自己的低级接口将自己的 USB 数据连接插入 NDK 中:
//NIMUDeviceTable[0].init =&CpswEmacInit; NIMUDeviceTable[0].init =&USBCxnInit;
一切正常、除非我在激活 DNS 模块时获得可靠的数据中止异常。 它们是可靠且可重复的。 每次都是如此。
首先、我是否正确分析了这一点?
ThreadType_Hwi 中发生异常。 Hwi 句柄:0x0。 Hwi 堆栈基地址:0x804b3cf8。 Hwi 堆栈大小:0x10000。 R0 = 0x80005eb4 R8 = 0x80005ea8 R1 = 0x14d20300 R9 = 0x6000011f R2 = 0x00000001 R10 = 0x48200000 R3 = 0x804c3c34 R11 = 0x00000001 R4 = 0x00000001 R12 = 0xe6e5fcc R5 = 0x804c90ac SP (R13)= 0x804c4c R8 = 0x804c R15 = 0x804c (R180x804c) R180x804c = 0x804c (R180x80245c) R8 = 0x804c (0x804c) R180x80245c = 0x80245c (0x80245r4 0x804c90a4 DFSR = 0x00000005 IFSR = 0x00000000 DFAR = 0xe6e5f857 IFAR = 0x00000000 ti.sysbios.family.arm.exc.exc.exc 例外:第205行:E_dataAbort:PC = 0x8048d26c、LR = 0x804212cc。 xdc.runtime.Error.raise:终止执行
PC 与 SP...相同。 现在、这很奇怪。 将 PC 重新放入 CCS 内的寄存器并不起作用、因为它来自 Sys/BIOS 内部、SP 寄存器不正确。 但我查看了 PC 中的地址、以及它在映射文件中的位置:
8048 cfd8. 000001e8. :unified_locale.obj (.text:_ZNSt4priv11__put 浮点 ISt19ostreambuf_iterIwSt11char_traitsIwEEEET_Rns_16_basical_ioceES5_RSt8ios_basewwwjRKss) 8048d1c0 000001e0 SYSBIOS.aea8fnv:BIOS.obj (.text:ti_SysBIOS_KNL_Semaphore_post__E) 8048d3a0 000001dc rtsv7A8_a_le_n_v3_eabi.lib:unified_locale.obj (.text:_ZNKSt9Money _putIwSt19ostreambuf_iterIwSt11char_traitsIwEEE6do _putES3_bRSt8ios_Basewe)
这就在 Semaphore_post 调用的中间。 确切地说、172个字节在中、或43个字(32位)在中。
那么、下面是正在进行的操作:
我有一个 USB 硬件中断、它正在加载缓冲区并从中断内部调用"Semaphore_post"来告诉"NetCtrl.c - NetScheduler() "任务数据已就绪、它会调用"NIMUPacketService"、它从 PBM 获取数据包并将其传递到堆栈。
在一种情况下、它会将数据传递到我的代码中、每个人都很高兴。 我的服务器工作正常。
在 DNS 情况下、它会创建一个任务来处理该请求、当下一个硬件中断发生时、它似乎处于处理过程中、而下一个硬件中断又从 HWI 内部调用 Semaphore_Post、并发生"数据中止"。
我正在按照 Sys/BIOS 文档的指示使用"Hwi_create()"创建硬件中断。
Hwi_Params_init (&usbInterruptParams); ERROR_INIT (&usbInterruptEb); usbInterruptParams.arg = 0; usbInterruptParams.priority =-1; usbInterruptParams.enableInt = false; usbHwi = Hwi_create (18、USBInterruptHandler、&usbInterruptParams、&usbInterruptEb); if (usbHwi = NULL){ 返回 false; }
我已经对其进行了测试、将大量数据传递到我的服务器代码中、没有问题。 在 DNS 情况下、消息很小、因此我确信它不是缓冲区溢出或类似的任何内容。
我已将任务堆栈大小设置为8192、远远超过 NDK 建议的5120。
那么、我的问题是 :什么可能导致 HWI 内部的数据中止(该数据中止是使用正常的 Hwi_create()调用和默认值创建的)? (这种情况的"默认"优先级是多少? 该文档只是说它将使用"适当"的值)。
或者、NDK 内的 DNS 任务中的什么可能与来自中断的 Semaphore_Post()调用发生冲突? 这两个函数都是 TI 库中的函数、因此我对它们的了解不够清楚。
或者、我还可以查看哪些其他信息来帮助更接近原因?
或者有其他有关调试它的建议吗?
任何建议都值得赞赏。
-CSW