概览
事件
嵌入式实时系统需要对整个系统环境产生的事件作出反应。在各种情况下,都需要作出合理的判断,以达到最佳事件处理的实现策略:
1. 怎么知道事件发生?通常采用中断方式(主动告知),但是事件输入也可以通过查询获得(被动获取)。
2. 通常情况下, ISR 应当越短越好。
学习任务:
1、哪些 FreeRTOS 的 API 函数可以在中断服务例程中使用。
2、延迟中断方案是处何实现的。
3、如何创建和使用二值信号量以及计数信号量。
4、二值信号量和计数信号量之间的区别。
5、如何利用队列在中断服务例程中把数据传入传出。
6、一些 FreeRTOS 移植中采用的中断嵌套模型。
中断产生:
根据不同平台有不同方式产生软中断和硬中断;
中断处理:
中断处理一般分两个部分,中断函数(尽量短的事件函数)和中断处理函数(后续反应函数)。
中断和任务的交互:
1、二值信号量同步:
简单的PV操作信号量,只有0和1;
创建二值信号量:
void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore );//参数为句柄;
带走一个信号(相当于V操作-1操作):
portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore,//句柄
portTickType xTicksToWait //超时等待时长,portMAX_DELAY表示永久等待;
);返回值为pdPASS表示成功,其余失败;
给出一个信号(相当于P操作+1操作):
xSemaphoreGiveFromISR()是 xSemaphoreGive()的特殊形式, 专门用于中断服务
例程中。
portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore,//句柄
portBASE_TYPE *pxHigherPriorityTaskWoken //地址当值变为pdPASS时,表示允许上下文切换;
);//返回值为pdPASS表示成功,其余失败(信号量已有);
xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount,
//创建的大小(最大值)
unsigned portBASE_TYPE uxInitialCount //开始计数的值,一般为0或者最大值
);//返回句柄或者NULL表示空间不足等失败;
对信号量的操作等同于二值信号量;
3、中断中队列交互:
xQueueSendToFrontFromISR(), xQueueSendToBackFromISR()与 xQueueReceiveFromISR()
分别是 xQueueSendToFront(), xQueueSendToBack()与 xQueueReceive()的中断安全
版本,专门用于中断服务例程中。
队列创建见队列管理:
http://blog.csdn.net/qq_36191395/article/details/78134713
中断中发送到队列头的使用(添加到队列尾参数相同):
portBASE_TYPE xQueueSendToFrontFromISR( xQueueHandle xQueue,//队列句柄
void *pvItemToQueue//发送的消息
portBASE_TYPE *pxHigherPriorityTaskWoken //地址当值变为pdPASS时,表示允许上下文切换;
);//返回值为pdPASS表示成功,其余失败(队列满);
4、中断嵌套:
高优先级中断打断低优先级中断;
注意:
任何信号量和队列要在中断中使用,必须使用中断特定的API函数,即带FromISR的函数.
事件
嵌入式实时系统需要对整个系统环境产生的事件作出反应。在各种情况下,都需要作出合理的判断,以达到最佳事件处理的实现策略:
1. 怎么知道事件发生?通常采用中断方式(主动告知),但是事件输入也可以通过查询获得(被动获取)。
2. 通常情况下, ISR 应当越短越好。
学习任务:
1、哪些 FreeRTOS 的 API 函数可以在中断服务例程中使用。
2、延迟中断方案是处何实现的。
3、如何创建和使用二值信号量以及计数信号量。
4、二值信号量和计数信号量之间的区别。
5、如何利用队列在中断服务例程中把数据传入传出。
6、一些 FreeRTOS 移植中采用的中断嵌套模型。
中断产生:
根据不同平台有不同方式产生软中断和硬中断;
中断处理:
中断处理一般分两个部分,中断函数(尽量短的事件函数)和中断处理函数(后续反应函数)。
中断和任务的交互:
1、二值信号量同步:
简单的PV操作信号量,只有0和1;
创建二值信号量:
void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore );//参数为句柄;
带走一个信号(相当于V操作-1操作):
portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore,//句柄
portTickType xTicksToWait //超时等待时长,portMAX_DELAY表示永久等待;
);返回值为pdPASS表示成功,其余失败;
给出一个信号(相当于P操作+1操作):
xSemaphoreGiveFromISR()是 xSemaphoreGive()的特殊形式, 专门用于中断服务
例程中。
portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore,//句柄
portBASE_TYPE *pxHigherPriorityTaskWoken //地址当值变为pdPASS时,表示允许上下文切换;
);//返回值为pdPASS表示成功,其余失败(信号量已有);
2、计数信号量:
PV操作号量,可以根据自身要求设置信号上线,一般用来资源管理(还剩多少资源)和事件计数(多少个事件)
创建计数信号量:xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount,
//创建的大小(最大值)
unsigned portBASE_TYPE uxInitialCount //开始计数的值,一般为0或者最大值
);//返回句柄或者NULL表示空间不足等失败;
对信号量的操作等同于二值信号量;
3、中断中队列交互:
xQueueSendToFrontFromISR(), xQueueSendToBackFromISR()与 xQueueReceiveFromISR()
分别是 xQueueSendToFront(), xQueueSendToBack()与 xQueueReceive()的中断安全
版本,专门用于中断服务例程中。
队列创建见队列管理:
http://blog.csdn.net/qq_36191395/article/details/78134713
中断中发送到队列头的使用(添加到队列尾参数相同):
portBASE_TYPE xQueueSendToFrontFromISR( xQueueHandle xQueue,//队列句柄
void *pvItemToQueue//发送的消息
portBASE_TYPE *pxHigherPriorityTaskWoken //地址当值变为pdPASS时,表示允许上下文切换;
);//返回值为pdPASS表示成功,其余失败(队列满);
4、中断嵌套:
高优先级中断打断低优先级中断;
注意:
任何信号量和队列要在中断中使用,必须使用中断特定的API函数,即带FromISR的函数.