电源控制(三种低功耗模式:sleep、stop、standby待机)
1、学习
1、任务
①创建任务:
(1)Task_Handle Task_creat(Task_FuncPtr,const Tak_Param *params,Eror_Blovck *eb);
(2)Task_Struct taskStruct;
void Task_construct(Task_Struct *structP,Task_FuncPtr fxn,const Task_Params *params,Error-Block *eb);
PS:Task_Handle 与 Task_Struct 可以相互转换
Task_Handle Task_handle(Task_struct *structP);
Task_Struct *Task_struct(Task_Handle handle);
TI-RTOS 中不能在中断函数中创建任务
②删除任务:
(1)Void Task_delete(Task_Handle *handleP); //指向任务实例指针
(2)Void Task_destruct(Task_Struct *structP);//指向任务 Task_Struct 结构指针
PS:删除任务之前,一定要将所有占用的资源都释放掉
③任务抢占:
(1)Key = Task_disable();//此时任何高优先级任务都无法进行抢占,但是 HWI 和 SWI 仍可以抢占
// 临界区代码
….
Task_restore(key);
(2)Void Task_sleep(UInt32 nticks) //系统 tick 数
//不要在main()、idle、 Hwi,Swi 和 disable/restore 结构中调用
(3)Void Task_yield();
④更改任务优先级:
Task_setPri();
2、任务间同步
1、信号量
二值信号量(可用&不可用)或记数信号量。默认为记数信号量(根据实际资源数来确定)
semParams.mode =(Semaphore_Mode_COUNTING | Semaphore_Mode_BINARY)
FIFO方式排队
|(Semaphore_Mode_COUNTING_PRIORITY | Semaphore_Mode_BINARY_PRIORITY)优先级排队
创建、删除信号量:
PS:先初始化参数Void Semaphore_Params_init(Semaphore_Params *params);然后设置模式(不设置则默认)
(1)Semaphore_Handle Semaphore_create(Int count,Semaphore_Params *attrs,Error_Block *eb);
Void Semaphore_delete(Samaphore_Handle *handleP);
(2)Void Semaphore_construct(Semaphore_Struct *structP,Int count,const Semaphore_Params *params);
Void Semaphore_destruct(Semaphore_Struct *structP);
(3)Semsphonre_Handle Semaphore_handle(Semaphore_Struct *structP);//Semaphore_handle函数从Semaphore_Struct结构中获得Semaphore_Handle信息
Semaphore_Struct *Sempahore_struct(Semaphore_Handle handel); //Semaphore_struct函数从Semaphore_Handle获得Semaphore_Struct结构指针
信号申请与释放:
(1)Bool Semaphore_pend(Semaphore_Handle handle,UInt32 timeout);//申请(timeout=BIOS_WAIT_DOREVER一直等待信号量可用;time=BIOS_NO_WAIT没有可用信号量,立即返回)
(2)Void Semaphore_post(Semaphore_Handle handle);//释放
(3)Int Semaphore_getCount(Semaphore_Hnadle handle);//查询当前信号count值
②事件:二值;任务与其它线程 OR 任务与其他SYS/BIOS对象(包括信号量、邮箱、消息队列等)之间通信。任务可以等待事件,任务、HWI、SWI或SYS/BIOS对象可以发布事件;
对象先注册事件对象。
Event_post()//对应ID事件可用
根据andMask OR orMask调用Event_pend()//对应ID事件不可用
每个对象实例可管理32个事件
任务才能调用Event_pend();Event_post()所有线程可调用
创建/删除事件对象:
(1)Void Event_construct(Event_Struct *structP, const Event_Params *params);
Void Event_destruct(Event_Struct *structP);
(2)Event_Handle Event_create(const Event_Params *params, Error_Block *eb);
Void Event_delete(Event_Handle *handleP);
PS:Event_Handle 与 Event_Struct 结构指针可以相互转换
Event_Handle Event_handle(Event_Struct *structP)
Event_Struct *Event_struct(Event_Handle handle)
事件pend/post:
(1)UInt Event_pend(Event_Handle handle, UInt andMask, UInt orMask, UInt32 timeout);//timeout=BIOS_WAIT_FOREVER|具体时间|BIOS_NO_WAIT
(2)Void Event_post(Event_Handle handle, UInt eventMask);//多个事件可以通过“+”或“|”进行连接
(3)UInt Event_getPostedEvents(Event_Handle handle);
③队列: 双向链接列表:Queue_next 或 Queue_prev 的调用可以在 Queue 上连续循环。修改队列前禁用中断的API:”原子”;不禁用中断的API:”非原子的”
队列创建/删除:
先初始化参数:Void Queue_Params_init(Queue_Params *params)
(1)Queue_Handle Queue_create(const Queue_Params *params, Error_Block *eb);
Void Queue_delete(Queue_Handle *handleP);
(2)Void Queue_construct(Queue_Struct *structP, const Queue_Params *params);
Void Queue_destruct(Queue_Struct *structP);
PS:Queue_Handle 与 Queue_Struct 结构进行互相转换:
Queue_Handle Queue_handle(Queue_Struct *structP);Queue_Struct *Queue_struct(Queue_Handle handle)
队列操作:
(1)Void Queue_enqueue(Queue_Handle handle, Queue_Elem *elem);//将指定的元素加入到队列后面
(2)Ptr Queue_dequeue(Queue_Handle handle);//从队列上删除第一个元素并返回(返回值为指向元素的指针)(调用 Queue_dequeue()之前,使用Queue_empty()进行判断,再决定是否调用 Queue_dequeue())
(3)Bool Queue_empty(Queue_Handle handle)
(4)Ptr Queue_head(Queue_Handle handle);//返回指向队列第一个元素的指针;调用 Queue_head ()之前,使用 Queue_empty()进行判断,再决定是否调用 Queue_head()
遍历队列:
(1)Ptr Queue_prev(Queue_Elem *qelem);//数返回 qelem(队列中的元素指针)之前元素指针。
(2)Ptr Queue_next(Queue_Elem *qelem);//返回 qelem 之后元素指针
插入删除元素:
(1)Void Queue_insert(Queue_Elem *qelem, Queue_Elem *elem);//将 elem 元素插入到 qelem 元素的前面
(2)Void Queue_remove(Queue_Elem *qelem);//从队列中删除指定的元素
④邮箱:
邮箱创建/删除:
Void Mailbox_Params_init(Mailbox_Params *params);//初始化邮箱参数
(1)Mailbox_Handle Mailbox_create(SizeT msgSize, UInt numMsgs, const Mailbox_Params *params, Error_Block *eb);//空间大小为(msgSize * numMsgs)
Void Mailbox_delete(Mailbox_Handle *handleP)
(2)Void Mailbox_construct(Mailbox_Struct *structP, SizeT msgSize, UInt numMsgs, constMailbox_Params *params, Error_Block *eb)
Void Mailbox_destruct(Mailbox_Struct *structP)
邮件发送/接受:
(1)Bool Mailbox_pend(Mailbox_Handle handle, Ptr msg, UInt32 timeout);//将邮箱第一个消息拷贝出来
(2)Bool Mailbox_post(Mailbox_Handle handle, Ptr msg, UInt32 timeout);//将消息拷贝到邮箱(提前检查是否有空位)
SizeT Mailbox_getMsgSize(Mailbox_Handle handle);//邮箱对象单个消息所占用的空间大小
Int Mailbox_getNumFreeMsgs(Mailbox_Handle handle);//邮箱对象当前空闲消息个数
Int Mailbox_getNumPendingMsgs(Mailbox_Handle handle);//邮箱对象当前内部消息个数,即被占用了多少个消息
三、HWI
四、SWI
五、门:设备禁止并发访问临界区代码
Gate_enter()返回的 key 被传给 Gate_leave(),抢占才会恢复
七、时间服务:
ti.sysbios.knl.Clock模块
ti.sysbios.hal,Timer模块
ti.sysbios.hal.Seconds模块
SYS/BIOS中,系统 Clock 管理所有的时间服务;tick 周期决定系统的心跳;Clock.tickPeriod 时间单位是微秒
3、RTOS(典型线程:ISR中断服务例程、任务、idle空闲)
调度进程:抢占(Preempted)式(正在运行的线程将一直持续到:①完成;②较高优先级的线程准备就绪;③线程在等待资源时放弃处理器)、时间片 (每一线程都有要执行的槽)
线程安全:一段代码以保证多个线程同时正确访问(读取、写入)的方式操作共享数据结构,则该代码段是线程安全的。
Blocked: 任务正在等待资源且未消耗任何CPU,则阻止该任务。
裸机:初始化、超级循环状态机、ISR
软实时与硬实时:尽可能快地完成&规定的时间内必须完成
实时操作系统组件:计划进程:保证最高优先级线程正在运行的抢占式计划进程。
通信机制:信号量、消息队列、队列等。
关键区域机制:互斥体、门、锁等。
计时服务:时钟、定时器等。
电源管理:对于低功耗设备,电源管理通常是RTOS的一部分,因为它知道设备的状态。
内存管理:可变大小的堆、固定大小的堆等。
外设驱动器:UART、SPI、I2C等。
协议栈:蓝牙、无线网络等。
文档系统:FatFs等。
设备管理:异常处理、启动等。
POSIX(Portable Operating System Interface):可移植操作系统接口。是一个操作系统兼容性层,允许应用进程在操作系统之间轻松移植。