本次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的任务阻塞操作可以看到任务一的计数变量不变,任务二的计数变量变化很快,这是因为任务二优先级高,并且没有任何空闲时间,所以任务一不会去执行