Step1: 可选择外部晶振, 和TIM1时钟源(FreeRtos默认使用systick时钟源避免冲突)。
再配置时钟树。
Step2: 打开FreeRtos ,并创建三个线程。消息队列CubeMx生成存在BUG,这里使用手写。
Step3: 创建完程序后先定义,并创建一个 消息队列。至此创建完毕,后可使用xQueueSend() 与xQueueReceive() 往消息队列中发送数据和,读取数据。
例子:
任务02:
任务03:
现象:
扩充:
本例子仅使用了xQueueSend(); 与xQueueReceive();两个入队与出队的函数。其余函数如下图所示:
浅析本历程所使用的 三个函数 :
xQueueCreate:
原型:
xQueueHandle xQueueCreate(
unsigned portBASE_TYPE uxQueueLength,
unsigned portBASE_TYPE uxItemSize
);
uxQueueLength | 队列中包含最大项目数量。 |
uxItemSize | 队列中每个项目所需的字节数。项目通过复制而不是引用排队,因为,所需的字节数,将复制给每个项目。队列中每个项目必须分配同样大小。 |
struct tagMsgQueuePara
{
xQueueHandle ParseQueueHandle;
}RamPara;
struct tagTaskQueueMessage
{
int Message;
};
RamPara = xQueueCreate(1, sizeof(struct tagTaskQueueMessage));
这样就创建了一个tagTaskQueueMessage结构体的空间
xQueueSend:
原型:
portBASE_TYPE xQueueSend(
xQueueHandle xQueue,
const void * pvItemToQueue,
portTickType xTicksToWait
);
xQueue | 处理将项目传递给队列 |
pvItemToQueue | 指向队列中放置的项目的指针。项目的大小,由队列创建时定义,因为许多字节可以从 pvItemToQueue复制到队列的储存区域 |
xTicksToWait | 最大时间量(任务应该锁住,等待队列中的可用空间)应该已经满了。如果设置为0,调用将立即返回。时间使用滴答周期来定义,因此如果需要,常量portTICK_RATE_MS应该用来转换实时时间 |
struct tagTaskQueueMessage
{
int Message;
};
struct tagTaskQueueMessage message;
message.Message = 1;
xQueueSend(RamPara,
(void *)&message,
(portTickType)0);
沿用了上面的创建,这样就入队了。
xQueueRece:
原型:
portBASE_TYPE xQueueReceive(
xQueueHandle xQueue,
void *pvBuffer,
portTickType xTicksToWait
);
pxQueue | 将要接收项目的队列句柄 |
pvBuffer | 指向将要复制接收项目的缓冲器的指针。 |
xTicksToWait | 任务中断并等待队列中可用空间的最大时间,应该是满的。如果设置为0,调用将立刻返回。时间在片区间中定义,如果需要,portTICK_RATE_MS常量用来转换为实际时间。 如果 INCLUDE_vTaskSuspend 定义为1 ,指定的中断时间( portMAX_DELAY) 将导致任务无限期中断(没有时间溢出)。 |
struct tagTaskQueueMessage
{
int Message;
};
struct tagTaskQueueMessage message1;
xQueueReceive(RamPara,
(void *)&message1,
0xffff);
沿用上面的,,这样就出队获取了数据。