结论如果 RAM 和处理能力足够,这不失为一种很好的解决方案。 需要仔细斟酌将应用程序划分为多个任务 以及分配给每个任务的优先级。
示例此示例是先前介绍的假设应用程序的部分实现。 使用 FreeRTOS API。设备控制任务此任务用于实现所有控制功能, 具有严格的定时要求, 因此在系统中具有最高优先级:#define CYCLE_RATE_MS 10 #define MAX_COMMS_DELAY 2 void PlantControlTask( void *pvParameters ) { TickType_t xLastWakeTime; DataType Data1, Data2; InitialiseTheQueue(); // A xLastWakeTime = xTaskGetTickCount(); // B for( ;; ) { // C vTaskDelayUntil( &xLastWakeTime, CYCLE_RATE_MS ); // Request data from the sensors. TransmitRequest(); // D if( xQueueReceive( xFieldBusQueue, &Data1, MAX_COMMS_DELAY ) ) { // E if( xQueueReceive( xFieldBusQueue, &Data2, MAX_COMMS_DELAY ) ) { PerformControlAlgorithm(); TransmitResults(); } } } // Will never get here! }请参阅上述代码片段内的标签:
嵌入式 Web 服务器任务嵌入式 Web 服务器任务可由以下伪代码表示。 此任务仅在数据可用时使用处理器时间, 但需要可变且相对较长的时间才能完成。 因此,该任务的优先级较低, 以防止对设备控制、RS232 或键盘扫描任务的定时产生不利影响。void WebServerTask( void *pvParameters ) { DataTypeA Data; for( ;; ) { // Block until data arrives. xEthernetQueue is filled by the // Ethernet interrupt service routine. if( xQueueReceive( xEthernetQueue, &Data, MAX_DELAY ) ) { ProcessHTTPData( Data ); } } }
RS232 接口此任务在结构上与嵌入式 Web 服务器任务非常相似。 该任务被赋予中等优先级, 以确保不会对设备控制任务的定时产生不利影响。void RS232Task( void *pvParameters ) { DataTypeB Data; for( ;; ) { // Block until data arrives. xRS232Queue is filled by the // RS232 interrupt service routine. if( xQueueReceive( xRS232Queue, &Data, MAX_DELAY ) ) { ProcessSerialCharacters( Data ); } } }
键盘扫描任务这是一项简单的周期性任务。 由于其定时要求类似于 RS232 任务,因此被赋予中等优先级。周期时间设置得比指定的限制快得多。 这是为了说明这样一个事实, 即该任务可能不会在请求时立即获得处理器时间, 并且执行时,可能会被设备控制任务抢占。
LED 任务这是所有任务中最简单的任务。#define DELAY_PERIOD 1000 void LEDTask( void *pvParmeters ) { TickType_t xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); for( ;; ) { // Wait for the next cycle. vTaskDelayUntil( &xLastWakeTime, DELAY_PERIOD ); // Flash the appropriate LED. if( SystemIsHealthy() ) { FlashLED( GREEN ); } else { FlashLED( RED ); } } }
下一篇> > > 解决方案# 3 : 减少 RAM 使用
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|