freertos内核控制(临界区)

目录

前言

一、临界区相关函数

二、使用


前言

        临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段。比如有的外设的初始化IIC、SPI等等,需要严格的时序,初始化过程中不能被打断。


一、临界区相关函数

FreeRTOS 与 临 界 段 代 码 保 护 有 关 的 函 数 有 4 个 :
taskENTER_CRITICAL()  //任务中进入临界区
taskEXIT_CRITICAL()      //任务中退出临界区
taskENTER_CRITICAL_FROM_ISR() //中断中进入临界区
taskEXIT_CRITICAL_FROM_ISR()     //中断中退出临界区
这四个函数其实是宏定义,在 task.h 文件中有定义。这四个函数的区别
前两个是任务级的临界段代码保护 ,后两个是 中断级的临界段代码保护

二、使用

任务中使用临界区:

FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。
进入然后退出临界段是“ 资源同步 ”的方法之一,能够在访问共享资源时保障信息的可靠性和完整性。 进入和退出临界区的函数要配套使用。
简单测试:
创建两个任务:
任务1:
对全局变量 sum1 sum2 操作。低优先级任 务让这两个变量始终相等,并不断在计数;
任务2:
高优先级任务不断的判断这两个变量是否相等,不相等则点亮 LED
相关代码:
void led0_task(void *pvParameters)
{
    while(1)
    {
			taskENTER_CRITICAL();//进入临界区
			if(sum1 != sum2)
				LED0 = ~LED0;
			taskEXIT_CRITICAL();//退出临界区
			vTaskDelay(500);
			
    }
}   


//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
			taskENTER_CRITICAL();//进入临界区
			sum1++;
			delay_xms(500);
			sum2++;
			taskEXIT_CRITICAL();//退出临界区
    }
}

结果是两个任务都在执行的前后增加了进入和退出临界区,保证了每个任务的代码完整执行,所以sum1永远等于sum2,LED0不闪烁。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

香菜是个好东西

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

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

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

打赏作者

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

抵扣说明:

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

余额充值