0
我是FreeRTOS的新手。我写了一个使用队列在任务之间传输数据的例子。尽管如此,结果显示是错误的。任何人都可以帮我解决这个问题吗?FreeRTOS:队列没有按预期工作
谢谢!要被显示
变量:
unsigned int temperatureRaw = 25;
unsigned int flowRateRaw = 30;
unsigned int carbonLevelRaw = 250;
unsigned int salinityLevelRaw = 75;
STRUCT保持指针的上述变量:
struct RawData {
unsigned int *temperatureRaw;
unsigned int *flowRateRaw;
unsigned int *carbonLevelRaw;
unsigned int *salinityLevelRaw;
};
typedef struct RawData RawData;
任务原型
static void vOLEDTask(void *pvParameters);
static void vTask1(void *pvParameters);
static void prvSetupHardware(void);
队列句柄:
QueueHandle_t xOLEDQueue, xRawQueue;
主营:
int main(void)
{
prvSetupHardware();
/* Create queues */
xOLEDQueue = xQueueCreate(mainOLED_QUEUE_SIZE, sizeof(xOLEDMessage *));
xRawQueue = xQueueCreate(3, sizeof(RawData *));
/* Check if queues are successfully created */
if((xOLEDQueue != 0) && (xRawQueue != 0)) {
// Declare variables
RawData xRawData = { &temperatureRaw, &flowRateRaw, &carbonLevelRaw, &salinityLevelRaw };
RawData *pxRawData = &xRawData;
/* Start the tasks defined within this file/specific to this demo. */
xTaskCreate(vOLEDTask, "OLED", mainOLED_TASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
xTaskCreate(vTask1, "Task1", 1000, (void *)pxRawData, 1, NULL);
/* Start the scheduler. */
vTaskStartScheduler();
}
return 0;
}
任务的定义:
void prvSetupHardware(void)
{
/* If running on Rev A2 silicon, turn the LDO voltage up to 2.75V. This is
a workaround to allow the PLL to operate reliably. */
if(DEVICE_IS_REVA2)
{
SysCtlLDOSet(SYSCTL_LDO_2_75V);
}
/* Set the clocking to run from the PLL at 50 MHz */
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);
}
void vOLEDTask(void *pvParameters)
{
RawData *pxRawData = NULL;
unsigned long ulMaxY;
static char cMessage[ mainMAX_MSG_LEN ];
extern volatile unsigned long ulMaxJitter;
const unsigned char *pucImage;
/* Functions to access the OLED. The one used depends on the dev kit
being used. */
void (*vOLEDInit)(unsigned long) = NULL;
void (*vOLEDStringDraw)(const char *, unsigned long, unsigned long, unsigned char) = NULL;
void (*vOLEDImageDraw)(const unsigned char *, unsigned long, unsigned long, unsigned long, unsigned long) = NULL;
void (*vOLEDClear)(void) = NULL;
/* Map the OLED access functions to the driver functions that are appropriate
for the evaluation kit being used. */
switch(HWREG(SYSCTL_DID1) & SYSCTL_DID1_PRTNO_MASK)
{
case SYSCTL_DID1_PRTNO_6965 :
case SYSCTL_DID1_PRTNO_2965 : vOLEDInit = OSRAM128x64x4Init;
vOLEDStringDraw = OSRAM128x64x4StringDraw;
vOLEDImageDraw = OSRAM128x64x4ImageDraw;
vOLEDClear = OSRAM128x64x4Clear;
ulMaxY = mainMAX_ROWS_64;
pucImage = pucBasicBitmap;
break;
case SYSCTL_DID1_PRTNO_1968 :
case SYSCTL_DID1_PRTNO_8962 : vOLEDInit = RIT128x96x4Init;
vOLEDStringDraw = RIT128x96x4StringDraw;
vOLEDImageDraw = RIT128x96x4ImageDraw;
vOLEDClear = RIT128x96x4Clear;
ulMaxY = mainMAX_ROWS_96;
pucImage = pucBasicBitmap;
break;
default : vOLEDInit = vFormike128x128x16Init;
vOLEDStringDraw = vFormike128x128x16StringDraw;
vOLEDImageDraw = vFormike128x128x16ImageDraw;
vOLEDClear = vFormike128x128x16Clear;
ulMaxY = mainMAX_ROWS_128;
pucImage = pucGrLibBitmap;
break;
}
/* Initialise the OLED and display a startup message. */
vOLEDInit(ulSSI_FREQUENCY);
for(;;)
{
xQueueReceive(xRawQueue, (void *)&pxRawData, portMAX_DELAY);
/* Display the message. */
sprintf(cMessage, "%s %u C", "Temperature", *(pxRawData->temperatureRaw));
vOLEDStringDraw(cMessage, 0, 10, mainFULL_SCALE);
sprintf(cMessage, "%s %u LPS", "Flow Rate", *(pxRawData->flowRateRaw));
vOLEDStringDraw(cMessage, 0, 20, mainFULL_SCALE);
sprintf(cMessage, "%s %u ppm", "Carbon Level", *(pxRawData->carbonLevelRaw));
vOLEDStringDraw(cMessage, 0, 30, mainFULL_SCALE);
sprintf(cMessage, "%s %u ppt", "Salinity Level", *(pxRawData->salinityLevelRaw));
vOLEDStringDraw(cMessage, 0, 40, mainFULL_SCALE);
}
}
/*-----------------------------------------------------------*/
static void vTask1(void *pvParameters)
{
RawData *pxRawData = (RawData *)pvParameters;
for(;;) {
xQueueSend(xRawQueue, (void *)&pxRawData, portMAX_DELAY);
vTaskDelay(1000/portTICK_RATE_MS);
}
}
感谢您的评论! 我将主范围之外的xRawData和pxRawData声明作为全局变量移动,我的代码正常工作。 此外,根据xQueueSend()的定义,第二个参数是指向要放置在队列中的项目的指针。因此,这就是为什么我传递一个指向RawData的指针的原因,因为xRawQueue持有指向RawData的指针。 –