ST意法半导体
直播中

王霞

7年用户 1349经验值
私信 关注
[问答]

在Cortex-M MCU上启动FreeRTOS调度程序会怎样呢

  • int main(void)
  • {
  •   HAL_Init();
  •   SystemClock_Config();
  •   MX_GPIO_Init();
  •   MX_USART3_UART_Init();
  •    const int* task_1_Param = 1;
  •    const int* task_2_Param = 2;
  •   xTaskCreate (vTask, "T1", 150, (void *)&task_1_Param, 1, NULL);
  •   xTaskCreate (vTask, "T2", 150, (void *)&task_2_Param, 1, NULL);
  •   vTaskStartScheduler();
  • }
  • void vTask(void * pvParams) {
  •          const int *tParam = (const int *)pvParams;
  •          HAL_Delay(100);
  •   for (;;) {
  •     printf("Task_%d Running.n", *tParam);
  •     printf("Task_%d Complete - Yielding Task.n", *tParam);
  •     taskYIELD();
  •     HAL_Delay(1000);
  •   }
  • }

回帖(1)

张秀兰

2022-12-23 15:34:22
具有自动存储功能的变量即使声明为const也不会存储在 ROM 中,而是分配在始终为 RAM 的堆栈中。
在普通的 C 程序中,您的原始实现是正确的,因为即使分配了堆栈,变量仍然有效或有效,因为它们的作用域或块(由花括号定义)没有留下。
但在这种特殊情况下,FreeRTOS 并不完全符合 C/C++ 语言,因为在 Cortex-M MCU 上启动 FreeRTOS 调度程序会重置和重用 ISR 的主堆栈,并将进程堆栈用于任务。这会破坏主堆栈分配的变量。
正如您提到的静态或全局变量不是堆栈分配的并且具有无限的生命周期并且保持有效。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分