uC/O中消息量函数分析OS_EVENT *OSSemCreate (INT16U cnt)及OSIntNesting的作用
来源:互联网 发布:淘宝怎么让别人代付 编辑:程序博客网 时间:2024/05/01 12:56
OS_EVENT *OSSemCreate (INT16U cnt) ;
该函数返回的数据类型为指针,指针指向的数据类型为OS_EVENT(事件的数据类型为结构体)。也就是函数返回一个地址,地址里存的是新创建的结构体类型所占据的内存的首地址。
OS_EVENT *pevent;
pevent = OSEventFreeList;
if (OSIntNesting > 0) { /* See if called from ISR ... */
return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
}
if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
}
;首先创建一个指向OS_EVENT结构体类型的指针pevent;系统初始化时会创建一个空事件控制块链表,而创建的空事件控制块的数目由常数OSEventMax来决定。OSEventFreeList就指向这个空事件控制块链表的第一个(OSEventFreeList = &OSEventTbl[0]),所以上面的程序里把OSEventFreeList赋给了pevent,也就是让pevent指向第一个空事件控制块,然后又让OSEventFreeList指向了空事件控制链表中的第二个。也就是从空事件链表中摘出了第一个给事件使用。
if (pevent != (OS_EVENT *)0) { /* Get an event control block */
pevent->OSEventType = OS_EVENT_TYPE_SEM;
pevent->OSEventCnt = cnt; /* Set semaphore value */
pevent->OSEventPtr = (void *)0; /* Unlink from ECB free list */
#if OS_EVENT_NAME_SIZE > 1
pevent->OSEventName[0] = '?'; /* Unknown name */
pevent->OSEventName[1] = OS_ASCII_NUL;
#endif
;以上就是对新创建的空任务控制块的各个量进行初始化。
OS_EventWaitListInit(pevent); ;通过调用OSEventWaitListInit()对事件控制块中的等待任务列表进行初始化。该函数初始化一个空的等待任务列表,其中没有任何任务。该函数的调用参数只有一个,就是指向需要初始化的事件控制块的指针pevent。
return (pevent); ;返回创建的结构体类型数据的首地址的指针
全局变量OSIntNesting有两个用途:
第一是用来记录中断嵌套的层数,中断嵌套也就是说当第一个中断发生而没有结束的时候,又发生了第二个更重要的中断,依次类推,此时OSIntNesting就用来表示嵌套的层数,也就是有多少个中断在发生或者等待处理,也就是说每当有中断发生时,就将OSIntNesting加1,有中断结束的时候,就将OSIntNesting减1;
第二是作为调度器是否可进行调度的标志,以保证调度器不会在中断服务程序中进行任务调度,也就是当OSIntNesting大于0的时候,将调度器加锁,OSIntNesting等于0的时候,调度器解锁。(这样理解调度器的加锁和解锁,是否正确?中断服务自程序结束前,会进行一次任务调度。这个时候调度器不是锁上的吗?如何调度呢?)
- uC/O中消息量函数分析OS_EVENT *OSSemCreate (INT16U cnt)及OSIntNesting的作用
- 消息量函数分析OS_EVENT *OSSemCreate (INT16U cnt)
- 消息量函数分析OS_EVENT *OSSemCreate (INT16U cnt)
- 消息量函数分析OS_EVENT *OSSemCreate (INT16U cnt)
- uc/os中OSTaskCreate()函数分析
- uc/os中OSSched()函数分析
- uc/os中OSStart()函数分析
- UC/GUI窗体管理及消息机制分析[转]
- OSIntNesting
- OSIntNesting
- 消息函数中View::OnLButtonDown(nFlags, point)的作用
- 消息循环中TranslateMessage和Dispatch函数的作用
- UVa 1606 两亲性分子 扫描法 && cnt++的分析
- 我的CNT
- CNT
- cnt
- 空间性质的哲学内涵及作用量规律表述
- 空间性质的哲学内涵及作用量规律表述
- 怎么让SOA以业务为中心?
- 404伪静态函数类
- hadoop 读写文件
- Sliverlight下多语言的实现的三种情况
- c++ map简单使用
- uC/O中消息量函数分析OS_EVENT *OSSemCreate (INT16U cnt)及OSIntNesting的作用
- WPF界面设计技巧—实现不规则动画按钮
- 使用【AudioManager】类控制音量
- 使用Google工具生成随机验证码
- Apartment STA MTA FREE 等
- 学习的技术
- Java网址
- ubuntu11.10+QtSDK+opencv环境配置
- Linux时间(date)格式化(yyyy-mm-dd hh:MM:ss)