跟着野火从零开始手搓FreeRTOS(5)空闲任务与阻塞延时

本文介绍了如何在FreeRTOS环境中创建空闲任务,管理任务延时,特别是通过SysTick实现阻塞延时,并在任务切换时处理空闲任务和延时任务的调度。

        裸机系统的软件延时通过让CPU等待来达到延时效果;而RTOS的优点就是完全发挥CPU的性能,即使延时也不会让CPU空等。操作系统的延时叫做阻塞延时,当任务需要延时的时候,任务会放弃CPU的使用权,直到延时结束,重新获得CPU进行运行。在延时期间,CPU可以处理其他的事情。

        在当前任务进入阻塞状态时,CPU可以去处理别的任务。假如当前没有别的任务可运行,CPU就会进入系统创建的空闲任务。空闲任务在调度器里是优先级最低的任务,其主体主要是做一些系统内存的清理工作。在实际应用中,当系统进入空闲任务后,可以让单片机进入休眠或者低功耗等操作。

        这里野火让空闲任务实现对一个全局变量进行计数的功能。 

实现空闲任务

        目前创建栈和任务控制块都是静态创建,使用静态内存。因此,需要预先定义内存空间。

定义空闲任务栈和任务控制块

        栈和TCB的内存空间均在main.c中定义。

       任务栈是一个定义好的数组,大小由 FreeRTOSConfig.h 中定义的宏  控制,默认为 128, 单位为字(byte),即 512 个字节(bit)。

/* 定义空闲任务的栈 */
/* 在FreeRTOSConfig.h中定义 */
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )

/* 获取空闲任务的内存 */
/* 在main.c中定义 */
StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
TCB_t IdleTaskTCB; //定义空闲任务发任务控制块

创建任务

        在定义好空闲任务的栈和任务控制块后,才可以创建空闲任务。空闲任务在调度器启动函数 vTaskStartScheduler()中创建。

        该部分在task.c中实现。

extern TCB_t IdleTaskTCB;

/* 传参函数声明 */
void vApplicationGetIdleTaskMemory( TCB_t **ppxIdleTaskTCBBuffer, 
                                    StackType_t **ppxIdleTaskStackBuffer, 
                                    uint32_t *pulIdleTaskStackSize );

void vTaskStartScheduler( void )
{   
    TCB_t *pxIdleTaskTCBBuffer = NULL;               /* 用于指向空闲任务控制块 */
    StackType_t *pxIdleTaskStackBuffer = NULL;       /* 用于空闲任务栈起始地址 */
    uint32_t ulIdleTaskStackSize;
    
    /* 获取空闲任务的内存:任务栈和任务TCB */
    vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, 
                            
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pQAQqa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值