2019년 9월 목요일 26 일 (STM32의 ucos3)

의 메시지 큐

1. 개념

    원하는 데이터 통신 태스크 동안 전송되는 경우, 그 자체가 메시지 큐가 사용될 수없는 송신 된 데이터 신호의 양 

    

 

 

    그리고 메시지를 보낼 수있는 작업을 중단,하지만 작업은 메시지를받을 수 있습니다

2. 프로그래밍

 

(1) 메시지 큐를 만들

  (OS_Q * p_q // 메시지 큐 제어 블록 (메시지 큐 참조) OSQCreate 무효화
                 CPU_CHAR * p_name를 // 메시지 큐 이름
                 OS_MSG_QTY의 max_qty // 메시지 큐 길이는 0이 아닌
                 OS_ERR * p_err) 에러를 리턴 //을

(2) 메시지 보내기

  , OSQPost (OS_Q * p_q을 무효화 // 메시지 큐 제어 블록 ()가 메시지 큐를 참조
               무효 * p_void, // 메시지 헤더 주소 보내
               OS_MSG_SIZE의 msg_size, 메시지 길이 //
               OS_OPT 수신 거부를, // 보내기 옵션을

                


               OS_ERR * p_err) // 오류 리턴

(3) 메시지를 수신

  보이드 OSQPend * (* OS_Q p_q는 // 메시지 큐 제어 블록 ()는 메시지 큐를 참조
                무한정 대기하는 // 0 시간 초과를 OS_TICK 타임 아웃
                // OS_OPT 선택 해제를 수신하는 옵션

                


                OS_MSG_SIZE *이 p_msg_size, // 메시지 길이
                CPU_TS *이 p_ts, // 타임 스탬프
                OS_ERR * p_err는) // 오류를 반환

뉴스 첫 번째 주소는 반환 값에 의해 반환

3. 내부 작업 메시지 큐

    이 작업은 메시지 큐에 속에서만이 작업은 메시지 큐, 인터럽트 다른 작업에서 메시지를 읽고 메시지 큐에 메시지를 보낼 수 있습니다

사용하여 프로그래밍 :

(1) 초기화를 만들 필요가 없습니다

(2) 메시지 보내기

  무효 OSTaskQPost은 (OS_TCB * p_tcb은, // 작업 제어 블록
                   무효 *이 p_void, // 메시지 헤더 주소
                   OS_MSG_SIZE의 msg_size, // 메시지 길이
                   OS_OPT 수신 거부, // 전송 특성
                   OS_ERR * p_err는) // 오류를 반환

(3) 수신 된 메시지를 (이 작업을 호출)    

  무효 * OSTaskQPend (OS_TICK 시간 초과, // 타임 아웃
                    OS_OPT 옵트은, // 수신 특성
                    OS_MSG_SIZE * p_msg_size, // 메시지 크기
                    CPU_TS *이 p_ts, // 타임 스탬프
                    OS_ERR * p_err는) // 오류를 반환

리턴 메시지는 첫 번째 주소를 수신

II. 소프트웨어 타이머

1. 개념

    클럭 소스로 시스템 소프트웨어 타이머 틱 시계 (틱)으로 너무 많은 기회없이 타이밍 정확도를위한 타이밍 기능을 달성하기 위해, 작업에 의해 달성시기는 달성

    타이머는 일반적으로 약간의주기적인 작업을 수행하는 데 사용

    타이머 작업 우선 순위 및 동작 주파수를 설정할 수 있습니다

        OS_CFG_TMR_TASK_PRIO 타이머 태스크의 우선 순위를 판정한다 (2)

        OS_CFG_TMR_TASK_RATE_HZ 타이머의 주파수 (100Hz에서)를 결정

2. 프로그래밍

(1) 타이머를 만들

  void  OSTmrCreate (OS_TMR               *p_tmr,//指向定时器
                   CPU_CHAR             *p_name,//定时器名字
                   OS_TICK               dly,//延时时间(单位是定时器参考周期 10ms)
                   OS_TICK               period,//周期时间(单位是定时器参考周期 10ms)
                   OS_OPT                opt,//定时器模式(单次模式/周期模式)

                    


                   OS_TMR_CALLBACK_PTR   p_callback,//定时器回调函数(无返回值,两个void *参数,第一个代表定时器)
                   void                 *p_callback_arg,//传递给回调函数的第二个参数
                   OS_ERR               *p_err)//错误返回

(2)如果不在使用,可以删除定时器

  CPU_BOOLEAN  OSTmrDel (OS_TMR  *p_tmr,//指向定时器
                       OS_ERR  *p_err))//错误返回

 (3)启动定时器

  CPU_BOOLEAN  OSTmrStart (OS_TMR  *p_tmr,//指向定时器
                       OS_ERR  *p_err)//错误返回

1)定时器以单次模式工作时,以延时时间(dly)间,只工作一次

 

2)定时器以周期模式工作时,延时时间为0,以周期时间(period)超时时间,周期性工作

 

3)定时器以周期模式工作时,延时时间非0,第一个周期超时时间为(dly),以后周期超时时间是周期时间(period),周期性工作

    

练习:

    使用软件定时器3s读取一次温湿度并且通过串口打印(将DHT11中的ms延时换成us)

三.事件标识组

1.概念

    事件标识组也是用来实现同步,而且用于多个对象之间的同步,同步方式有与同步/或同步

 

    与同步就是等待所有的条件成立,或同步等待其中一个条件成立

  

2.编程接口

 

(1)创建

  void  OSFlagCreate (OS_FLAG_GRP  *p_grp,//指向事件标识组
                    CPU_CHAR     *p_name,//名称
                    OS_FLAGS      flags,//初始值(32位)
                    OS_ERR       *p_err)//错误返回

(2)修改事件标识组标识

  OS_FLAGS  OSFlagPost (OS_FLAG_GRP  *p_grp,//指向事件标识组
                      OS_FLAGS      flags,//代表要修改的位(要修改的位为1,不修改的位为0)
                      OS_OPT        opt,//改为1/改为0

                        


                      OS_ERR       *p_err)//错误返回

(3)等待事件标识组

  OS_FLAGS  OSFlagPend (OS_FLAG_GRP  *p_grp,//指向事件标识组
                      OS_FLAGS      flags,//代表要等待的位(要等待的位为1,不等待的位为0)
                      OS_TICK       timeout,//超时时间
                      OS_OPT        opt,//等待选项

                      


                      CPU_TS       *p_ts,//时间戳
                      OS_ERR       *p_err)//错误返回

四.等待多个内核对象

1.概念

    等待多个内核对象允许等待多个不同的内核对象(信号量,消息队列,标识组),根据等到的不同的内核对象进行不同的处理,类似与Linux中多路复用

    要使用等待多个内核对象的功能,需要将 宏 OS_CFG_PEND_MULTI_EN 的值置1

2.函数接口(等待)

  OS_OBJ_QTY  OSPendMulti (OS_PEND_DATA  *p_pend_data_tbl,//等待对象数组
                         OS_OBJ_QTY     tbl_size,//数组长度
                         OS_TICK        timeout,//超时时间
                         OS_OPT         opt,//等待选项

                            


                         OS_ERR        *p_err)//错误返回

//对象数组成员类型

struct  os_pend_data {
    OS_PEND_DATA        *PrevPtr;
    OS_PEND_DATA        *NextPtr;
    OS_TCB              *TCBPtr;//任务控制块
    OS_PEND_OBJ         *PendObjPtr;//要等待的对象
    OS_PEND_OBJ         *RdyObjPtr;//等到的对象
    void                *RdyMsgPtr;//消息首地址
    OS_MSG_SIZE          RdyMsgSize;//消息长度
    CPU_TS               RdyTS;//时间戳
};

추천

출처www.cnblogs.com/zjlbk/p/11593836.html