This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好!
我将 FreeRTOS 用于由 HalCoGen 生成的 TI Hercules 项目、并想 使用 SEGGER SystemView 来调试我的项目。
将跟踪代码移植到内核时遇到问题。
例如、官方 Segger 补丁需要修改 TI 端口中不存在的 xPortSysTickHandler 函数。
diff -rupN org/FreeRTOS/portable/GCC/ARM_CM0/port.c new/FreeRTOS/portable/GCC/ARM_CM0/port.c --- org/FreeRTOS/portable/GCC/ARM_CM0/port.c 2020-12-15 19:54:26.000000000 +0100 +++ new/FreeRTOS/portable/GCC/ARM_CM0/port.c 2021-03-03 10:20:34.000000000 +0100 @@ -359,13 +359,19 @@ void xPortSysTickHandler( void ) uint32_t ulPreviousMask; ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + traceISR_ENTER(); { /* Increment the RTOS tick. */ if( xTaskIncrementTick() != pdFALSE ) { + traceISR_EXIT_TO_SCHEDULER(); /* Pend a context switch. */ portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } + else + { + traceISR_EXIT(); + } } portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); }
我们还需要定义 SEGGER_SysView_X_GetInterruptId ()函数。
不知道如何获得 IRQ 中断号吗?
有没有关于将 FreeRTOS 的 TI 端口与 SystemView 配合使用的指南?
如何移植 TI 内核以使用 SystemView?
此致、
加布里埃尔
尊敬的 Gabriel:
我们已开始着手解决您的问题、我们将很快提供更新。
--
谢谢。此致、
Jagadish。
Jagadish、您好!
以下是自我撰写该问题以来的一些更新。
我仍然不确定应该如何处理 SysTick 处理程序。
我设法 使用 TI PMU 来实现 SEGGER_SysView_X_GetInterruptId。
该解决方案仍然有一些 问题(请参阅我的其他 e2e 问题)、但我很快就要解决了。
我还 使用 IRQVECREG 寄存器实施了 SEGGER_SysView_X_GetInterruptId。
我不确定这是否是正确的方法。 如果您有任何想法、请告诉我。
我现在最大的问题是 portraise_privacy 和 portENTER_critical ()之间的摩擦。
让我举一个例子:
我的任务调用 vTaskDelay。
正如预期的那样、它进入了 MPU 包装程序函数内部、所以提升了它的特权
在 vTaskDelay 中,FreeRTOS 使我们能够使用 traceTASK_DELAY ()跟踪此事件,该 traceTASK_DELAY ( )定义为 SEGGER_Sysview_RecordU32x3 ()
我们的跟踪引擎 SystemView 希望确保跟踪操作是原子操作。
因此它将其日志记录函数包含在 record_start()和 record_end()中。
这些包装器称为 FreeRTOS portENTER_critical ()和 portEXIT_critical ()。
问题是调用 record_end()时, portEXIT_critical ()重置了我们的特权。
导致 MPU 崩溃。
您是否有办法解决 portraise_privacy 和 portENTER_critical ()之间的冲突?
很抱歉后面有一个大的跟进。
希望对其他论坛的用户有所帮助
此致、
加布里埃尔
尊敬的 Gabriel:
将主题帖传输给专家。
--
谢谢。此致、
Jagadish。
Jagadish、您好!
感谢您的回答。
我正在慢慢进步,但我仍然遇到问题,正如你可以看到我的 新问题。
尊敬的 Cabriel:
我不知道 portEXIT_Critical ()在你的项目中做了什么。 如果 portEXIT_critical ()要重新启用中断、并且在中断服务例程中调用此函数、则 TMS570 ARM-R 器件不支持嵌套中断、因此可能会生成数据中止。
在 HAL FreeRTOS 示例中、RTI 比较0用于生成计时器节拍。
您好、QJ:
很抱歉延迟了、 在过去的2周里、我还需要注意其他事情。
portEXIT_critical 是 HalCoGen 的 FreeRTOS 端口提供的函数、前提是我没有错。
尽管我仍需要支持、以便将 SystemView 与 TI 软件配合使用、但 我已在论坛中打开了一个新问题、该问题专门针对 ISR 问题:
Unknown 说:portEXIT_critical 是 HalCoGen 的 FreeRTOS 端口提供的函数
是的、但它是一个空函数。 Hercules 器件不支持 nextes 中断。 当 IRQ 中断被处理时、IRQ 被自动禁用。