摘要:
1、任务调度:osal采用一个链表结构来管理协议栈各层相应任务。相关操作函数有,添加任务到链表中;获取下一个活动任务;根据taskID查找下一个任务。osal采用轮询任务调度队列(任务链表),通过两个函数:调度程序主循环函数和设置事件发生标志函数。
2、时间管理:通过为事件设置超时等待时间,一旦等待时间结束,便为对应任务设置事件发生标志,从而达到对事件进行延时处理目的。
3、原语通信:请求响应原语操作:一旦调用了下层相关函数后,就立即返回。下层处理函数在操作结束后,将结果以消息的形式发送到上层并产生一个系统事件,调度程序发现这个事件后就会调用相应的事件处理函数对它进行处理。两个相关函数:向目标任务发送消息的函数;消息提取函数。
一、操作系统介绍
//-------------------------------------------------------------------------------------
二、下面分析下这个协议栈调度程序(OSAL)的调度机制。
(一)任务调度
链表的建立是按照任务优先级从高到低的顺序进行插入的。优先级高的任务将被插入到优先级低的任务前面。如果俩任务优先级相同,则按照时间顺序加入到链表中。那么这个任务链表在系统启动的时候建立,一旦建立后便一直存在于事个系统运行的过程中,直到系统关闭或硬件复位才被销毁。
typedef void (*pTaskEventHandlerFn)(usigned char task_id unsigned short event_flag);
typedef struct osalTaskRec
{
} osalTaskRec_t;
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
(1)在任务管理列表中添加任务
Extern osalTaskAdd(pTaskInitFn pfnInit,pTaskEventHandleFn pfnEventProcessor,byte taskPriorty);
(2)获取下一个活动任务
Extern osalTaskRec_t *osalNextActiveTask(void)
(3)根据taskID查找任务
Extern osalTaskRec_t
当任务链表建立成功后,系统便开始运行。如果在系统运行的过程中有事件发生,系统就会通过调用相应的任务,即事件处理函数,对所发生的事件进行相应处理。在整个运行过程中,调度程序(OSAL)始终不停地轮询任务队列链表,以发现需要处理的事件。这个过程涉及两个函数操作:
1、调度程序主循环函数
2、设置事件发生标志函数
(1)系统主循环
{
}
(2)设置事件发生标志
extern byte osal_start_timer(byte task_id, uint16 event_id, uint16 timeout_value);
这个函数为事件event_id设置超时等待时间timeout_value。一旦等待结束,便为task_id所对应的任务设置相应的事件发生标记,再对事件进行相应处理。
(三)原语通信
(原语只是一个理论层面上的术语,描述了服务层次的关系,以及两个通信的N用户和它们相连的N层(子层)对待协议实体之间的关系。初学时总是想不通原语跟协议栈的代码有什么关系,后来才了解了原语只是规范里面的一个术语,反映到协议栈代码里就是一个个具体的函数了!例如我们可以看到很多原语是以request,confirm等为后缀的,到了程序里面就是相应的request请求函数,confirm确认函数了。)
一个原语的操作往往需要逐层调用下层函数并根据下层返回的结果来进行进一步的操作。在这种情况下,一个原主的操作从发起到完成需要很长时间。因此,如果让程序一直等待下层返回的结果再进一步处理,会使微处理器大部分时间处于循环等待之中,无法及时处理其它请求。
1、向目标任务发送消息的函数
extern byte osal_msg_send(byte destination_task,byte *msg_ptr,byte len);
参数destination_task是目标任务的任务号,参数指针msg_ptr指向要被发送的消息,参数len为消息长度
2、消息提取函数
typedef struct
{
}osal_msg_rec_header_t;
typedef struct
{
extern osal_msg_received_t
extern osal_msg_received_t
这个函数返回一个指向osal_msg_received结构的指针,通过msg_ptr这个指针就可以提取出所需要的信息。(有一个例子,是以MAC层返回原语MCPS_DATA.confirm所对应的函数为例,下次再说明)
说明:本文作者所记录,错误处还请高手指点,本人随时更新,转载请注明出处。