一:osal api总结:
1、在osal中注册自己服务的办法:
-在自己的 .c\.h 文件定义跟声明好两个函数:
void xxxtask_Init( uint8 taskId );
uint16 xxxtask_processEvent( uint8 task_id, uint16 events );
-将这两个函数注册到一个特殊文件中:
初始化函数放在osalInitTasks()函数中, 任务处理函数放在xxxtask_processEvent放在taskArr[]数组中。值得注意的是:在将初始化函数以及任务处理函数放入上面这两个地方,元素位置不能乱放。其位置必然是对应的,例如:
2、osal任务触发方法:
-事实上,osal常常会在初始化函数的最后一行触发任务处理以启动一个任务,也可以说是线程:可以使用 osal_set_event( xxx_task_id, xxx_event )。当然,任务的启动也可以在别的已经启动的任务中添加osal_set_event(),不过最一般的写法还是放在该任务自身对应的初始化函数的最后一行。
-osal的事件触发:
osal_set_event(task_id, event); | 触发一次任务的对应事件 |
osal_start_timerEx(task_id, event, time); | 定时触发多次任务的对应事件 |
osal_start_reload_timer(task_id, event, time); | 循环定时触发任务的对应事件 |
3、osal的消息功能:
-api函数:
uint8 *osal_msg_allocate(uint16 len ); | 申请一个消息空间,消息的类型有要求 |
osal_msg_send( task_id, pMsg ); | 发送消息pMsg给task_id |
osal_msg_receive(task_id); | 在对应的任务中接受消息,消息的发送会触发一个特殊事件 |
osal_msg_deallocate(pMsg); | 将申请的消息空间释放,申请一个,释放一个 |
-msg的一些注意点:
.要发送的消息其定义的数据类型具有特殊要求:如我在程序中定义的一个消息类型:
可以看到第一个元素的类型是:osal_event_hdr_t hdr,该段写法固定。具体原因是:TI给出的开源osal例程中,对osal_msg_allocate()的函数实现中将申请到的消息空间中的osal_msg_hdr_t类型长度的空间中写入了一些信息:
。其处在在消息空间前面,在自定义类型时要规避这部分空间。这也是为什么网上大部分例程给出的自定义类型将 osal_event_hdr_t (没写错,不是 osal_msg_hdr_t )类型放首位。
.在osal中,消息的发送是入队的。但是值得注意:当触发消息发送事件时,在对应任务事件处理函数中,必须至少接收一个消息,否则该任务进入阻塞,无法响应其他事件。当消息接受没有完全接受队列消息时,会在下次轮询继续触发消息事件。
4、osal中常用的一些函数:
osal_memset() | 内存设置 |
osal_memcpy() | 内存复制 |
osal_memcmp() | 内存比较 |
osal_memdup() | 内存备份 |
5、osal事件处理函数书写格式:
-事件处理函数都是由一些具备完整功能的代码段组成。其格式为:
if( events & xxx_EXENT ){
;//you code
return ( exents ^ xxx_EVENT );
}
-原因解释:略