void osal_start_system( void ) { #if !defined ( ZBIT ) && !defined ( UBIT ) for(;;) // Forever Loop #endif { uint8 idx = 0; osalTimeUpdate(); Hal_ProcessPoll(); // This replaces MT_SerialPoll() and osal_check_timer(). do { if (tasksEvents[idx]) // Task is highest priority that is ready. { break; } } while (++idx < tasksCnt); if (idx < tasksCnt) { uint16 events; halIntState_t intState; HAL_ENTER_CRITICAL_SECTION(intState); events = tasksEvents[idx]; tasksEvents[idx] = 0; // Clear the Events for this task. HAL_EXIT_CRITICAL_SECTION(intState); events = (tasksArr[idx])( idx, events ); HAL_ENTER_CRITICAL_SECTION(intState); tasksEvents[idx] |= events; // Add back unprocessed events to the current task. HAL_EXIT_CRITICAL_SECTION(intState); } #if defined( POWER_SAVING ) else // Complete pass through all task events with no activity? { osal_pwrmgr_powerconserve(); // Put the processor/system into sleep } #endif } }
时间: 2024-04-18 12:29:13 浏览: 119
这段代码是 Zigbee 应用中的 `osal_start_system()` 函数的实现。该函数用于启动系统的任务循环,并处理任务事件。
函数的主要流程如下:
1. 首先,调用 `osalTimeUpdate()` 函数更新系统时间。
2. 调用 `Hal_ProcessPoll()` 函数,该函数取代了 `MT_SerialPoll()` 和 `osal_check_timer()`,用于处理串口通信和定时器事件。
3. 使用一个循环来遍历任务数组 `tasksArr`,查找最高优先级且已准备好的任务。
4. 如果找到了任务,就执行该任务的回调函数,并将任务的事件作为参数传递给回调函数。
5. 回调函数执行完成后,将未处理的事件重新添加到当前任务的事件集合中。
6. 如果没有找到任何准备好的任务,且定义了宏 `POWER_SAVING`,则调用 `osal_pwrmgr_powerconserve()` 函数将处理器/系统置于休眠状态。
需要注意的是,具体的实现可能会根据所使用的 Zigbee 应用框架和协议栈版本而有所不同。因此,在实际开发中,你需要参考相应的文档和示例代码来理解和使用 `osal_start_system()` 函数。同时,还需要根据具体的硬件平台和需求进行适当的配置和参数设置。
相关问题
int main(void) { /* Initialize hardware */ HAL_BOARD_INIT(); // Initialize board I/O InitBoard( OB_COLD ); /* Initialze the HAL driver */ HalDriverInit(); /* Initialize NV system */ osal_snv_init(); /* Initialize LL */ /* Initialize the operating system */ osal_init_system(); /* Enable interrupts */ HAL_ENABLE_INTERRUPTS(); // Final board initialization InitBoard( OB_READY ); #if defined ( POWER_SAVING ) osal_pwrmgr_device( PWRMGR_BATTERY ); #endif /* Start OSAL */ osal_start_system(); // No Return from here return 0; }
这是一段 C 语言程序,它的作用是初始化硬件、驱动和操作系统,并启动操作系统。程序流程如下:
1. 初始化硬件,包括初始化板子的输入输出。
2. 初始化 HAL 驱动。
3. 初始化 NV 系统。
4. 初始化 LL。
5. 初始化操作系统。
6. 启用中断。
7. 完成最后的板子初始化。
8. 开启操作系统。
该程序中的一些函数和宏定义可能是针对特定的硬件平台和操作系统的,因此需要结合具体的开发环境来理解。
static void SerialApp_Send(void){ #if SERIAL_APP_LOOPBACK if (SerialApp_TxLen < SERIAL_APP_TX_MAX) { SerialApp_TxLen += HalUARTRead(SERIAL_APP_PORT, SerialApp_TxBuf+SerialApp_TxLen+1, SERIAL_APP_TX_MAX-SerialApp_TxLen); } if (SerialApp_TxLen) { (void)SerialApp_TxAddr; if (HalUARTWrite(SERIAL_APP_PORT, SerialApp_TxBuf+1, SerialApp_TxLen)) { SerialApp_TxLen = 0; } else { osal_set_event(SerialApp_TaskID, SERIALAPP_SEND_EVT); } } #else if (!SerialApp_TxLen && (SerialApp_TxLen = HalUARTRead(SERIAL_APP_PORT, SerialApp_TxBuf+1, SERIAL_APP_TX_MAX))) { // Pre-pend sequence number to the Tx message. SerialApp_TxBuf[0] = ++SerialApp_TxSeq; } if (SerialApp_TxLen) { if (afStatus_SUCCESS != AF_DataRequest(&SerialApp_TxAddr, (endPointDesc_t *)&SerialApp_epDesc, SERIALAPP_CLUSTERID1, SerialApp_TxLen+1, SerialApp_TxBuf, &SerialApp_MsgID, 0, AF_DEFAULT_RADIUS)) { osal_set_event(SerialApp_TaskID, SERIALAPP_SEND_EVT); } } #endif}每行代码注释
这段代码实现了一个串口应用程序的发送功能。下面是每行代码的注释:
```
static void SerialApp_Send(void){
```
定义了一个名为SerialApp_Send的静态函数。
```
#if SERIAL_APP_LOOPBACK
```
如果定义了SERIAL_APP_LOOPBACK宏,则执行下面的代码。
```
if (SerialApp_TxLen < SERIAL_APP_TX_MAX) {
```
如果已经发送的数据长度小于最大发送长度,则执行下面的代码。
```
SerialApp_TxLen += HalUARTRead(SERIAL_APP_PORT, SerialApp_TxBuf+SerialApp_TxLen+1, SERIAL_APP_TX_MAX-SerialApp_TxLen);
```
从串口读取数据,并将数据存储到SerialApp_TxBuf数组中。
```
}
if (SerialApp_TxLen) {
```
如果已经发送的数据长度不为0,则执行下面的代码。
```
(void)SerialApp_TxAddr;
```
将SerialApp_TxAddr强制转换为void类型,以避免编译器警告。
```
if (HalUARTWrite(SERIAL_APP_PORT, SerialApp_TxBuf+1, SerialApp_TxLen)) {
```
将SerialApp_TxBuf数组中的数据写入到串口中。
```
SerialApp_TxLen = 0;
```
将已发送的数据长度清零。
```
} else {
```
如果写入数据失败,则执行下面的代码。
```
osal_set_event(SerialApp_TaskID, SERIALAPP_SEND_EVT);
```
设置一个事件,以便在稍后的时间重新发送数据。
```
}
}
#else
```
如果没有定义SERIAL_APP_LOOPBACK宏,则执行下面的代码。
```
if (!SerialApp_TxLen && (SerialApp_TxLen = HalUARTRead(SERIAL_APP_PORT, SerialApp_TxBuf+1, SERIAL_APP_TX_MAX))) {
```
如果还没有发送数据,并且从串口中读取到了数据,则执行下面的代码。
```
SerialApp_TxBuf[0] = ++SerialApp_TxSeq;
```
将序列号添加到待发送的数据中。
```
}
if (SerialApp_TxLen) {
```
如果已经发送的数据长度不为0,则执行下面的代码。
```
if (afStatus_SUCCESS != AF_DataRequest(&SerialApp_TxAddr, (endPointDesc_t *)&SerialApp_epDesc, SERIALAPP_CLUSTERID1, SerialApp_TxLen+1, SerialApp_TxBuf, &SerialApp_MsgID, 0, AF_DEFAULT_RADIUS)) {
```
使用AF_DataRequest函数向目标地址发送数据。
```
osal_set_event(SerialApp_TaskID, SERIALAPP_SEND_EVT);
```
如果发送失败,则设置一个事件,以便在稍后的时间重新发送数据。
```
}
}
#endif}
```
结束函数并关闭条件编译。
阅读全文