freeRTOS Kernel Control-vTaskSuspendAll-xTaskResumeAll
来源:互联网 发布:数据库的概念模型 编辑:程序博客网 时间:2024/05/22 04:32
=======================================================================
上面这句话什么意思?说得是“这里不用加上critical section。想知道原因?那么到论坛里看Richard Barry的回复”
然后我一输入网址打不开。critical section是什么意思呢?在百度百科的简介里面是这么说得“不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。每个线程中访问临界资源的那段代码称为临界区(Critical Section)。”
找了找freertos代码,感觉作者说得可能是这两句:
#define portENTER_CRITICAL()vPortEnterCritical()
#define portEXIT_CRITICAL() vPortExitCritical()
在非操作系统时,也遇到这个知识点,并且印象极其深刻。这是所谓的“原子”操作。关键是这个变量“uxSchedulerSuspended”的数据类型与处理器的处理位数的关系。比如说STM32F407是32位处理器那么如果uxSchedulerSuspended的数据类型若大于32位,则要小心了!因为这个变量就无法被一条汇编语句处理,如果在两条汇编语句之间进入了中断服务程序,而中断服务程序里面恰好有对这个变量uxSchedulerSuspended的处理,那么以前的汇编语句可能就读取错误。当然这个错误发生概率极低了。有两种方法处理这个问题,一个是指向含有uxSchedulerSuspended的语句之前禁止中断,执行完后使能中断。还有一种方式是弄个临时变量比较一下。如果两次的值相同的话就是正确的值。
=================================================================
void vTaskSwitchContext( void )
{
if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE )
{
/* The scheduler is currently suspended - do not allow a context switch. */
xYieldPending = pdTRUE;
}
else
{
//DO SOMETHING !!!
}
}
、====================================
简单总结一下:
(0)挂起是令调度器阻止上下文切换,但是却能继续使能中断。
那么为什么要挂起呢?因为vTaskSuspendAll和xTaskResumeAll之间的代码执行时间有点长。
(1)vTaskSuspendAll和xTaskResumeAll必须成双入对。
(2)可以嵌套,如下:
vTaskSuspendAll();
//DOsomething!!
vTaskSuspendAll();
//DOsomething!!
xTaskResumeAll();
//DOsomething!!
xTaskResumeAll();
- freeRTOS Kernel Control-vTaskSuspendAll-xTaskResumeAll
- FreeRTOS(V8.0.1)系统之vTaskSuspendAll()和xTaskResumeAll()
- vTaskSuspendAll和xTaskResumeAll
- FreeRTOS
- FreeRTOS
- linux kernel-2.6.28.6 / CPU control
- FreeRTOS----创建FreeRTOS项目
- Control
- Control
- Control
- Control
- FreeRTOS--XQueueReceiveFromISR
- 初识FreeRTOS
- freertos小记
- 配置 FreeRTOS
- FreeRTOS分析
- 初识FreeRTOS
- 配置FreeRTOS
- python实现简单线性回归
- 聚焦移动办公、CRM、HR服务领域——企业服务三会成功召开
- 把脉百度AI,“三得”、“三失”与“三策”
- 阿里云将全面提供IPv6服务 | 中国制造业正被双向挤压,需智能化发展
- Mac在一段时间不使用后,应用会自动退出的解决方法
- freeRTOS Kernel Control-vTaskSuspendAll-xTaskResumeAll
- Caffe各层可视化, python实现
- 第一次测试,一二两题
- IPv6终于要取代IPv4了!!!你准备好了么?
- 一张图熟知yarn资源调度流程
- codeforce 777c Alyona and Spreadsheet
- PostgreSQL安装后Navicat客户端连接报错:Could not connect to server:Connection refused(0x00002740/10061)
- 2017-12-1 7周5次课 linux防火墙--netfilter
- js中的事件委托或是事件代理详解——为未创建的元素添加事件、对批量元素添加事件