FreeRTOS 队列结构 C
FreeRTOS Queue Struct C
我不明白如何声明可用于在 FreeRTOS 中的两个线程之间发送数据的结构。
我有两个线程,一个应该用数据填充结构,另一个应该从结构中读取数据,数据是用消息队列发送的。
数据可以通过指针复制,数据量不大。
在我的 main.c 文件中,我声明了结构并声明了队列和队列句柄:
在 int main(void) 之前:
xQueueHandle LED_Queue_Handle, ChannelFreqQueue;
struct AMessage
{
uint8_t channelID;
float channelFreq;
};
在 main 中我创建队列
ChannelFreqQueue = xQueueCreate(2, sizeof(struct AMessage *));
在需要向队列发送数据的任务中:
static void StopCompThread(void const *argument)
{
uint32_t count=0;
uint8_t ActiveChannel =0;
uint16_t uartcount =0;
const float period = 0.0085;
static float frequency = 0;
for (;;)
{
struct AMessage txIdrisData;
if(xSemaphoreTake(OscStopSem, portMAX_DELAY)) // Timer 17 Callback 8.5ms
{
HAL_TIM_Base_Stop_IT(&htim17);
__HAL_TIM_SET_COUNTER(&htim17,0);
count = __HAL_TIM_GetCounter(&htim3);
uartcount++;
uint16_t pinstatus = (uint16_t)GPIOB->ODR & 0x2000;
if (pinstatus == 0)
{
ActiveChannel = 0x01;
}
else ActiveChannel = 0x02;
if (uartcount == 525)
{
txIdrisData.channelID = ActiveChannel;
txIdrisData.channelFreq = frequency;
xQueueSend(ChannelFreqQueue, (void *) &txIdrisData,portMAX_DELAY);
}
}
} //FORever
} // StopCompThread
然后是需要从队列中接收数据的任务:
static void IDRISThread(void const *argument)
{
struct AMessage rxIdrisData;
float temp = 0.0;
uint8_t channel = 0;
char IdrisDataBuf[11] = {0}; // 3 Bytes x 4 channels = 12 Bytes
uint8_t IdrisStatusByte = 0;
for (;;)
{
xQueueReceive( ChannelFreqQueue, &( rxIdrisData ), portMAX_DELAY );
temp = rxIdrisData.channelFreq;
channel = rxIdrisData.channelID;
temp = temp * 1000;
snprintf(IdrisDataBuf, 2, "%.0f",temp); // Channel Data - Counts/Frequency
if (channel == 0x00)
{
IdrisDataBuf[2] = 0x00;
}
if (channel == 0x01)
{
IdrisDataBuf[2] = 0x01;
}
uart_send(IdrisDataBuf, 12);
} //FORever
} // IDRISThread
我确定我对如何声明和使用结构有误解,而且我混淆了指针和非指针。我尝试使用此 API 文档作为参考:http://www.freertos.org/a00118.html
如果有人能指出我的错误或提供可能有助于我理解的伪代码,我们将不胜感激。
您没有空间在队列中存储元素
ChannelFreqQueue = xQueueCreate(2, sizeof(struct AMessage *));
创建 2 个指向 struct AMessage
结构的指针元素。
你需要的是 struct AMessage
的 2 元素数组
ChannelFreqQueue = xQueueCreate(2, sizeof(struct AMessage));
为什么不直接队列结构,而不是指针结构,会简单很多。阅读 FreeRTOS Queues documentation page and see the "Alternatives To Using Queue Sets" section half way down the Queue Sets 页面上的简介。
我不明白如何声明可用于在 FreeRTOS 中的两个线程之间发送数据的结构。
我有两个线程,一个应该用数据填充结构,另一个应该从结构中读取数据,数据是用消息队列发送的。
数据可以通过指针复制,数据量不大。
在我的 main.c 文件中,我声明了结构并声明了队列和队列句柄: 在 int main(void) 之前:
xQueueHandle LED_Queue_Handle, ChannelFreqQueue;
struct AMessage
{
uint8_t channelID;
float channelFreq;
};
在 main 中我创建队列
ChannelFreqQueue = xQueueCreate(2, sizeof(struct AMessage *));
在需要向队列发送数据的任务中:
static void StopCompThread(void const *argument)
{
uint32_t count=0;
uint8_t ActiveChannel =0;
uint16_t uartcount =0;
const float period = 0.0085;
static float frequency = 0;
for (;;)
{
struct AMessage txIdrisData;
if(xSemaphoreTake(OscStopSem, portMAX_DELAY)) // Timer 17 Callback 8.5ms
{
HAL_TIM_Base_Stop_IT(&htim17);
__HAL_TIM_SET_COUNTER(&htim17,0);
count = __HAL_TIM_GetCounter(&htim3);
uartcount++;
uint16_t pinstatus = (uint16_t)GPIOB->ODR & 0x2000;
if (pinstatus == 0)
{
ActiveChannel = 0x01;
}
else ActiveChannel = 0x02;
if (uartcount == 525)
{
txIdrisData.channelID = ActiveChannel;
txIdrisData.channelFreq = frequency;
xQueueSend(ChannelFreqQueue, (void *) &txIdrisData,portMAX_DELAY);
}
}
} //FORever
} // StopCompThread
然后是需要从队列中接收数据的任务:
static void IDRISThread(void const *argument)
{
struct AMessage rxIdrisData;
float temp = 0.0;
uint8_t channel = 0;
char IdrisDataBuf[11] = {0}; // 3 Bytes x 4 channels = 12 Bytes
uint8_t IdrisStatusByte = 0;
for (;;)
{
xQueueReceive( ChannelFreqQueue, &( rxIdrisData ), portMAX_DELAY );
temp = rxIdrisData.channelFreq;
channel = rxIdrisData.channelID;
temp = temp * 1000;
snprintf(IdrisDataBuf, 2, "%.0f",temp); // Channel Data - Counts/Frequency
if (channel == 0x00)
{
IdrisDataBuf[2] = 0x00;
}
if (channel == 0x01)
{
IdrisDataBuf[2] = 0x01;
}
uart_send(IdrisDataBuf, 12);
} //FORever
} // IDRISThread
我确定我对如何声明和使用结构有误解,而且我混淆了指针和非指针。我尝试使用此 API 文档作为参考:http://www.freertos.org/a00118.html
如果有人能指出我的错误或提供可能有助于我理解的伪代码,我们将不胜感激。
您没有空间在队列中存储元素
ChannelFreqQueue = xQueueCreate(2, sizeof(struct AMessage *));
创建 2 个指向 struct AMessage
结构的指针元素。
你需要的是 struct AMessage
ChannelFreqQueue = xQueueCreate(2, sizeof(struct AMessage));
为什么不直接队列结构,而不是指针结构,会简单很多。阅读 FreeRTOS Queues documentation page and see the "Alternatives To Using Queue Sets" section half way down the Queue Sets 页面上的简介。