FreeRTOS简单任务调度实现

Diana ·
更新时间:2024-09-20
· 902 次阅读

本次FreeRTOS任务调度通过S32K144来实现,首先进行工程的创建,然后做代码分析。
在这里插入图片描述选择file->new->S32DS Application Project
在这里插入图片描述填写工程名称,选择S32K144,点击next
在这里插入图片描述FPU Support选择Hardware:-mfloat -abi = hard(否则,添加FreeRTOS模块编译会不通过),SDKs选择了2.0.0,当然还可以选择更高版本的,选高版本会支持更多东西,然后Finish,此时工程就创建好了
在这里插入图片描述双击components,弹出下图在这里插入图片描述
右击FreeRTOS将其add to project在这里插入图片描述点击生成代码,此时FreeRTOS模块配置完成,接下来进行代码的编写,sources下创建rtos.h与rtos.c,main函数去调用rtos_start()即可。

#ifndef RTOS_H #define RTOS_H #include "FreeRTOS.h" #include "task.h" #define PEX_RTOS_START rtos_start void rtos_start(void); void freertos_task1(void *pvParameters); void freertos_task2(void *pvParameters); #endif #include "rtos.h" uint32_t freertos_task1_counter = 0U; uint32_t freertos_task2_counter = 0U; void rtos_start(void) { /* 创建两个任务*/ xTaskCreate(freertos_task1, "task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); xTaskCreate(freertos_task2, "task2", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); /* 通过下面这句话开始进行任务调度 */ vTaskStartScheduler(); /*如果一切正常,函数时不会执行到这里的,但如果执行到这里,很可能是内存堆空间不足导致 空闲任务无法创建 */ for( ;; ) { /* no code here */ } } void freertos_task1(void *pvParameters) { const TickType_t delay_counter_1000ms = pdMS_TO_TICKS(1000UL); while(1) { freertos_task1_counter++; vTaskDelay(delay_counter_1000ms); } } void freertos_task2(void *pvParameters) { const TickType_t delay_counter_2000ms = pdMS_TO_TICKS(2000UL); while(1) { freertos_task2_counter++; vTaskDelay(delay_counter_2000ms); } }

此例,给两个任务做了一个任务计数操作,任务一每隔1s执行一次,任务二每隔2s执行一次,通过vTaskDelay方法将相应任务置为阻塞状态来实现 在这里插入图片描述
通过debug观察两个任务的计数状态可以看出,任务一执行8次的时候,任务二执行了4次,两个任务虽然都是while(1)死循环,可以通过任务调度在一个挂起的时候执行另一个,符合设计逻辑,xTaskCreate的第五个参数是任务优先级的定义,此处数字越大代表优先级越高,对代码稍作修改,观察一下现象

#include "rtos.h" uint32_t freertos_task1_counter = 0U; uint32_t freertos_task2_counter = 0U; void rtos_start(void) { /* 创建两个任务*/ xTaskCreate(freertos_task1, "task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); xTaskCreate(freertos_task2, "task2", configMINIMAL_STACK_SIZE, NULL, 2, NULL ); /* 通过下面这句话开始进行任务调度 */ vTaskStartScheduler(); /*如果一切正常,函数时不会执行到这里的,但如果执行到这里,很可能是内存堆空间不足导致 空闲任务无法创建 */ for( ;; ) { /* no code here */ } } void freertos_task1(void *pvParameters) { // const TickType_t delay_counter_1000ms = pdMS_TO_TICKS(1000UL); while(1) { freertos_task1_counter++; // vTaskDelay(delay_counter_1000ms); } } void freertos_task2(void *pvParameters) { // const TickType_t delay_counter_2000ms = pdMS_TO_TICKS(2000UL); while(1) { freertos_task2_counter++; // vTaskDelay(delay_counter_2000ms); } }

这里将任务一优先级设为1,任务二优先级设为2,关闭vTaskDelay的任务阻塞操作在这里插入图片描述可以看到任务一的计数变量不变,任务二的计数变量变化很快,这是因为任务二优先级高,并且没有任何空闲时间,所以任务一不会去执行


作者:AdokenTorothy



freertos 任务调度

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章