FreeRTOS静态方法实验两个LED灯闪烁

已经移植好 FreeRTOS 工程模板,本实验就在该模板基础上增加功能代码,

可将工程模板复制一份重新命名为“任务创建--静态方法” 本章所要实现的功能是:使用静态内存方法创建 2 个任务,分别控制 2 个 LED 闪烁

1定义任务函数

任务实际上就是一个无限循环且不带返回值的 C 函数。我们创建 2 个这样 的任务,让开发板上面的 LED 灯以 1S 的频率闪烁,具体实现代码如下。

//任务 1 函数
void task1_task(void *pvParameters)
{
while(1)                  //(1)
{
LED1=0;
vTaskDelay(200);                //(2)
LED1=1;
vTaskDelay(800);
}
}
//任务 2 函数
void task2_task(void *pvParameters)
{
while(1)
{
LED2=0;
vTaskDelay(800);
LED2=1;
vTaskDelay(200);
}
}

代码(1):任务必须是一个死循环,否则任务将通过 LR 返回,如果 LR 指 向了非法的内存就会产生 HardFault_Handler,而 FreeRTOS 指向一个死循环, 那么任务返回之后就在死循环中执行,这样子的任务是不安全的,所以为避免这 种情况,任务一般都是死循环并且无返回值的。

代码(2):任务里面的延时函数必须使用 FreeRTOS 里面提供的延时函数, 并不能使用我们裸机编程中的那种延时。这两种的延时的区别是 FreeRTOS 里面 的延时是阻塞延时,即调用 vTaskDelay()函数的时候,当前任务会被挂起,调 度器会切换到其它就绪的任务,从而实现多任务。如果还是使用裸机编程中的那 种延时,那么整个任务就成为了一个死循环,如果恰好该任务的优先级是最高的, 那么系统永远都是在这个任务中运行,比它优先级更低的任务无法运行,根本无 法实现多任务。但 FreeRTOS 中的延时最小值只能是 ms,对于 us 级别的延时怎 么办呢,这个在前面移植操作系统时我们介绍过,使用 SysTick.c 文件中的延时 函数亦可,包括 ms 和 us 级延时,这两个延时函数与裸机实验中是不一样的,所 以不要搞混

2 空闲任务与定时器任务堆栈函数

当我们使用了静态创建任务的时候,configSUPPORT_STATIC_ALLOCATION 这 个宏定义必须为 1(在 FreeRTOSConfig.h 文件中),并且我们需要实现两个函 数:vApplicationGetIdleTaskMemory()与 vApplicationGetTimerTaskMemory(),这两个函数是用户设定的空闲(Idle)任 务与定时器(Timer)任务的堆栈大小,必须由用户自己分配,而不能是动态分 配,具体代码如下

/* 空闲任务任务堆栈 */
static StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
/* 定时器任务堆栈 */
static StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];
/* 空闲任务控制块 */
static StaticTask_t Idle_Task_TCB;
/* 定时器任务控制块 */
static StaticTask_t Timer_Task_TCB;
//获取空闲任务地任务堆栈和任务控制块内存,因为本例程使用的
//静态内存,因此空闲任务的任务堆
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值