本次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的任务阻塞操作可以看到任务一的计数变量不变,任务二的计数变量变化很快,这是因为任务二优先级高,并且没有任何空闲时间,所以任务一不会去执行
上一篇:通过PWM做一个简单的呼吸灯
下一篇:通过TIM输出比较做一个定时器
推荐阅读最新更新时间:2024-11-11 10:50
设计资源 培训 开发板 精华推荐
- STR-30-60V-BLDC-MDK-GEVB:1kW、30-60V 电机开发板
- DIY zigbee2mqtt zigbee3.0网关
- 使用 Diodes Incorporated 的 PT8A 3518C 的参考设计
- DC1562A-D,用于 LTC6992-2 的演示板,10 kHz,5-95% 占空比
- AP1694AEV11,基于 AP1694 230VAC TRIAC 可调光 GU10 LED 驱动器的评估板
- LTC3531-3.3,锂离子至 3.3V 原理图和 100mA 效率曲线
- LT6656ACS6-2.5、2.5V 升压输出电流电压基准的典型应用
- MC32PF3000A5EP PMIC 解决方案电源管理的典型应用
- AM6TW-4815DH35Z ±15V 6 瓦双路输出 DC-DC 转换器的典型应用
- LTC3448、600mA 开关转换器通过在轻负载时自动切换到线性稳压器来降低噪声