[关闭]
@richey 2020-09-29T15:07:31.000000Z 字数 6306 阅读 1202

物联网综合应用 嵌入式软件设计讲座之嵌入式实时操作系统

嵌入式软件 实时操作系统


5 嵌入式实时操作系统

5.1 嵌入式实时操作系统介绍

image.png-154.1kB

5.2 实时多任务基础

5.2.1 任务状态

image.png-105.4kB

  1. //ucos-II代码
  2. void vButtonTask(void){
  3. while(TRUE) {
  4. //阻塞直至有键按下
  5. }
  6. }
  7. void vLevelTask(void){
  8. while(TRUE){
  9. //读油箱液位,完成 读油箱液位,完成各种计算
  10. }
  11. }
  12. void void main(void main(void){
  13. OSInit OSInit();
  14. OSTaskCreateExt( OSTaskCreateExt(vButtonTask vButtonTask);
  15. OSTaskCreateExt( OSTaskCreateExt(vLevelTask vLevelTask); );
  16. OSStart OSStart();
  17. }

5.2.2 多任务内核

image.png-170.3kB

image.png-151.1kB

image.png-156.5kB

image.png-142.3kB

5.3 信号量与数据共享

  1. struct {
  2. long lTankLevel;
  3. long lTimeUpdated;
  4. } tankdata[MAX_TANKS];
  5. void vButtonTask(void){
  6. int inti;
  7. while(TRUE){
  8. //阻塞直至有键按下
  9. i = //获取键值
  10. TakeSemphore();
  11. //输出i号油箱液位及其更新时间
  12. ReleaseSemphore();
  13. }
  14. }
  15. void vCaculateTankLevel(){
  16. int inti = 0;
  17. while(TRUE){
  18. TakeSemphore();
  19. //修改 tankdata[i].lTimeUpdated及tankdata[i].TankLevel
  20. ReleaseSemphore ReleaseSemphore();
  21. }
  22. }

image.png-194.2kB

5.4 基于嵌入式操作系统的实时多任务软件设计基础(以μC/OS/ii为例)

  1. void main(void){
  2. OSInit(); /* 初始化uC/OS-II */
  3. //通过调用OSTaskCreate()或
  4. //OSTaskCreateExt()创建至少一个任务;
  5. OSStart(); /* 开始多任务调度!OSStart()永远不会返回*/
  6. }
  1. static OS_STK AppTaskKbdStk[APP_TASK_KBD_STK_SIZE];
  2. static void AppTaskKbd(void*p_arg);
  3. OSTaskCreate(AppTaskKbd,
  4. (void *)0,
  5. (OS_STK *)&AppTaskKbdStk[APP_TASK_KBD_STK_SIZE-1],
  6. APP_TASK_KBD_PRIO
  1. void USART1_IRQHandler(void){ //STM32中断示例
  2. INT8U err, c ;
  3. OS_CPU_SR cpu_sr cpu_sr; // ; // OSIntExit用到改变量
  4. OS_ENTER_CRITICAL();
  5. OS_ENTER_CRITICAL();
  6. OSIntNesting++;
  7. OS_EXIT_CRITICAL();
  8. OS_EXIT_CRITICAL();
  9. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
  10. c = USART_ReceiveData(USART1);
  11. UartPutRxChar(c,COM1 );
  12. USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  13. }
  14. if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) {
  15. c = UartGetTxChar UartGetTxChar( &err,COM1);
  16. if( err == UART_OK )
  17. USART_SendData(USART1, c);
  18. USART_SendData(USART1, c);
  19. USART_ClearITPendingBit(USART1, USART_IT_TXE);
  20. }
  21. OSIntExit OSIntExit(); (); }
  22. }
  1. // 时钟节拍ISR
  2. void OSTickISR(void) {
  3. (1)保存处理器寄存器的值;
  4. (2)调OSIntEnter()或将OSIntNesting1;
  5. (3)调用OSTimeTick(); /*检查每个任务的时间延时*/
  6. (4)调用OSIntExit();
  7. (5)恢复处理器寄存器的值;
  8. (6)执行中断返回指令; ;
  9. }
  10. void SysTickHandler(void){
  11. OS_CPU_SR cpu_sr;
  12. OS_ENTER_CRITICAL();
  13. OSIntNesting++;
  14. OS_EXIT_CRITICAL();
  15. OSTimeTick();
  16. OSIntExit();
  17. }

5.5 任务间通信机制(以μC/OS/ii为例)

5.5.1 信号量

5.5.2 邮箱

image.png-330.3kB

  1. //技巧void * 强制类型转换
  2. INT8U CommRxBuf[100];
  3. void CommTaskRx(void *pdata){
  4. for (;;){
  5. ...
  6. err = OSMboxPost(CommMbox, (void*)&CommRxbuf[0]);
  7. ...
  8. }
  9. }

5.5.3 消息队列 (Message Queue):

image.png-521.9kB

image.png-366kB

image.png-246.5kB

image.png-263.5kB

image.png-140.8kB

image.png-90.4kB

image.png-133.5kB

image.png-109.4kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注