OS_EVENT *OSQCreate (void **start, INT16U size) { OS_EVENT *pevent; OS_Q *pq; #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0u; #endif解释代码
时间: 2024-02-14 15:17:14 浏览: 24
这段代码是 uC/OS-II 操作系统中的 OSQCreate 函数的实现,用于创建一个消息队列。下面对函数的具体实现进行解释:
```c
OS_EVENT *OSQCreate (void **start, INT16U size)
{
OS_EVENT *pevent;
OS_Q *pq;
#if OS_CRITICAL_METHOD == 3u
OS_CPU_SR cpu_sr = 0u;
#endif
```
首先定义了两个指针类型的变量 pevent 和 pq,分别表示消息队列事件控制块和消息队列数据结构。接着使用条件编译判断系统的临界区保护方式,如果是使用 CPU 自带的原子操作指令,则定义一个 CPU 状态寄存器变量 cpu_sr,用于保存关闭中断前的 CPU 状态。
```c
OS_ENTER_CRITICAL();
pq = (OS_Q *)OSMemGet((OS_MEM *)&OSQMem, &osErr); /* Allocate a memory block for the message queue */
OS_EXIT_CRITICAL();
if (osErr != OS_ERR_NONE) {
return ((OS_EVENT *)0);
}
pq->OSQPtr = pq->OSQStart = start; /* Point to beginning of queue */
pq->OSQEnd = &start[size]; /* Point to end of queue */
pq->OSQIn = pq->OSQOut = 0u; /* Clear queue */
pq->OSQSize = size;
pq->OSQEntries = 0u;
pevent = &pq->OSQEvent;
OS_EventWaitListInit(pevent); /* Initialize the event control block */
pevent->OSEventType = OS_EVENT_TYPE_Q;
return (pevent); /* Return pointer to event control block */
}
```
接下来进入临界区,使用 OSMemGet 函数从消息队列内存池中分配一个内存块用于存储消息队列数据结构,然后退出临界区。
如果分配内存块失败,则返回一个空指针,否则对消息队列数据结构进行初始化,包括将消息队列指针指向队列起始位置、队列结束位置、清空队列、设置队列大小、设置队列中已有的元素个数等。
最后,将消息队列事件控制块指针指向消息队列数据结构中的事件控制块部分,对事件控制块进行初始化,包括设置事件类型为消息队列类型,并返回指向事件控制块的指针。