因为移植OPENAMP的需求,将操作系统从RTX5切换到FreeRTOS,发现虽然用了CMSIS_RTOS_V2封装,但是无法给任务直接指定堆栈(指定后都无法进入任务),是我用法不对还是其他问题?
[C] 纯文本查看 复制代码
int main(void)
{
....
osKernelInitialize(); // 内核初始化
TaskIdleId = osThreadNew(TaskIdle, NULL, &TaskIdle_Attr); // 创建空闲任务
osKernelStart(); // 启动内核
....
}
//任务堆栈
uint64_t taskLv1Stk[LV1_STK_SIZE];
uint64_t taskLv2Stk[LV2_STK_SIZE];
uint64_t taskLv3Stk[LV3_STK_SIZE];
uint64_t taskIdleStk[IDLE_STK_SIZE];
//任务属性
const osThreadAttr_t TaskLv1_Attr = {
.name = "TaskLv1",
.attr_bits = osThreadDetached,
// .stack_mem = taskLv1Stk,
// .stack_size = sizeof(taskLv1Stk),
.stack_size = 128 * 4,
.priority = osPriorityNormal3,
};
const osThreadAttr_t TaskLv2_Attr = {
.name = "TaskLv2",
.attr_bits = osThreadDetached,
// .stack_mem = taskLv2Stk,
// .stack_size = sizeof(taskLv2Stk),
.stack_size = 128 * 4,
.priority = osPriorityNormal2,
};
const osThreadAttr_t TaskLv3_Attr = {
.name = "TaskLv3",
.attr_bits = osThreadDetached,
// .stack_mem = taskLv3Stk,
// .stack_size = sizeof(taskLv3Stk),
.stack_size = 128 * 4,
.priority = osPriorityNormal1,
};
const osThreadAttr_t TaskIdle_Attr = {
.name = "TaskIdle",
.attr_bits = osThreadDetached,
// .stack_mem = taskIdleStk,
// .stack_size = sizeof(taskIdleStk),
.stack_size = 128 * 4,
// .priority = osPriorityIdle,
.priority = osPriorityIdle,
};
//任务id
osThreadId_t TaskLv1Id = NULL;
osThreadId_t TaskLv2Id = NULL;
osThreadId_t TaskLv3Id = NULL;
osThreadId_t TaskIdleId = NULL;
/*******************************************************************************
* @brief 进程LV1 1ms执行一次
*******************************************************************************/
void TaskLv1(void *arg)
{
while(1)
{
osDelay(1);
}
}
/*******************************************************************************
* @brief 进程LV2 10ms执行一次
*******************************************************************************/
void TaskLv2(void *arg)
{
while(1)
{
osDelay(10);
}
}
/*******************************************************************************
* @brief 进程LV3 1000ms执行一次
*******************************************************************************/
void TaskLv3(void *arg)
{
while(1)
{
GPIO_Toggle(LED_RED);
GPIO_Toggle(LED_BLUE);
osDelay(1000);
}
}
/*******************************************************************************
* @brief 空闲任务
*******************************************************************************/
void TaskIdle(void *arg)
{
//创建任务
TaskLv1Id = osThreadNew(TaskLv1, NULL, &TaskLv1_Attr);
TaskLv2Id = osThreadNew(TaskLv2, NULL, &TaskLv2_Attr);
TaskLv3Id = osThreadNew(TaskLv3, NULL, &TaskLv3_Attr);
HAL_ResumeTick();
while(1)
{
shellTask(&SysShell);
}
}
|