书籍:正点原子STM32F1 UCOS开发手册 V2.0
一、软件定时器
①、是一个递减计数器,减到0时触发回调函数。分辨率由系统节拍频率决定。
②、OSTmrCreate中的重要参数,dly:初始化定时器延时值。period:重复周期(计数值,自动重置)。opt:单次/周期定时器。
③、单次定时器只运行一次,周期定时器可以一直重复运行,直到调用OSTmrStop。
④、单次定时器从dly开始递减;周期定时器第一次从dly递减(dly不为0),后面从period递减。
二、信号量和互斥信号量
①、信号量像是一种上锁机制,代码获得对应的钥匙才能执行。控制任务存取共享资源、同步。
②、二进制信号量一次只能一个任务使用共享资源;计数型信号量可以同时有多个任务访问共享 资源。
③、信号量现在更多的用于任务与任务之间、任务与中断之间的同步,它可以避免轮询扫描标志 位,减少CPU的消耗。(例:按下按键发送一个信号量,任务获取到该信号量屏幕背景颜色变 化 一次)
④、互斥信号量:解决优先级反转问题。说明:任务优先级H、M、L的三个任务,L获得信号量开 始访问共享资源;此时H因获取不到信号量,进入挂起状态,等待L释放信号量;M剥夺CPU 使用权开始执行;最后L继续执行,释放信号量后,H执行。照成M先于H执行的现象。
⑤、互斥信号量会将L的优先级升至同H一样,防止被M中断,L执行完成并释放掉互斥信号量后, 会将L的优先级恢复到原来状态。
⑥、任务内嵌信号量:不需要创建信号量,简化代码。OSTaskSemPost函数的参数指向要用信号 通知的任务的TCB。
三、消息队列
①、用于任务间的通信。发布数据是指针传递。消息队列的读取采用先进先出(FIFO),或者后进 先出(LIFO--紧急消息采用此方式非常有用)。
②、消息发布到队列中,最高优先级的任务获得该消息,也可以向消息队列中广播一则消息。
③、任务内建消息队列:不需要使用外部的消息队列就可以直接向任务发布消息,简化代码。
四、事件标志组
①、解决一个任务和多个事件之间的同步。
②、同步关系可以是“或”和“与”;创建事件标志组时需赋一个初值;OSFlagPost向事件标志组发布 标志,决定了对哪些位进行清零和置位(flags opt);OSFlagPend等待事件标志组,决定等待 哪些位是置为还是清零(flags opt)。
③、等待的是单个对象的有:信号量、互斥信号量、消息队列、事件标志组等。
五、同时等待多个内核对象
①、和事件标志组的区别:同时等待多个内核对象。但UCOSIII只支持同时等待多个信号量和消息 队列。
②、同时等待任意数量的信号量或者消息队列,它们之间是 “或” 的关系。
③、先初始化OS_PEND_DATA表中的每个元素的PendObjPtr,使各个指针指向被等待的对象; OSPendMulti函数返回有几个内核对象准备好了。