SDK中提供了freertos的SDK,位于:
AT32L021_Firmware_Library_V2.0.5\middlewares\freertos
SDK中也提供了freertos的例程,位于:
AT32L021_Firmware_Library_V2.0.5\utilities\at32l021_freertos_demo
为了更好的学习使用FreeRTOS,还是自己搭建一下环境:
1、将freertos源码加入工程
2、加入include路径:
..\..\..\..\middlewares\freertos\source\include
..\..\..\..\middlewares\freertos\source\portable\rvds\ARM_CM0
..\..\..\..\middlewares\freertos\source\portable\memmang
3、拷贝一个FreeRTOSConfig.h到inc下
FreeRTOSConfig.h可以从FREERTOS例程中找到。
4、将at32l021_int.c中的三个函数注释掉,如果有
因为和FreeRTOS冲突了
/*
void SVC_Handler(void)
{
}
*/
/*
void PendSV_Handler(void)
{
}
*/
/*
void SysTick_Handler(void)
{
}
*/
5、include port
根据编译环境选择port文件
/* support ac5 and ac6 compiler */
#if (__ARMCC_VERSION > 6000000)
#include "..\..\..\middlewares\freertos\source\portable\GCC\ARM_CM0\port.c"
#else
#include "..\..\..\middlewares\freertos\source\portable\rvds\ARM_CM0\port.c"
#endif
6、freertso开始
建立一个队列,一个发送信息的任务,一个接收信息的任务
/* enter critical */
taskENTER_CRITICAL();
xQueue = xQueueCreate(10, sizeof(char *));
xTaskCreate(
vSenderTask, // 任务函数
"Sender", // 任务名称
512, // 堆栈大小
NULL, // 任务输入参数
tskIDLE_PRIORITY + 1, // 任务优先级
NULL // 任务句柄
);
printf("Create vSenderTask\r\n");
// 创建接收任务
xTaskCreate(
vReceiverTask, // 任务函数
"Receiver", // 任务名称
512, // 堆栈大小
NULL, // 任务输入参数
tskIDLE_PRIORITY + 2, // 任务优先级
NULL // 任务句柄
);
printf("Create vReceiverTask\r\n");
/* exit critical */
taskEXIT_CRITICAL();
vTaskStartScheduler();
7、发送信息任务处理
void vSenderTask(void *pvParameters) {
char *strToSend;
int i=0;
for(;;) {
strToSend = (char *)malloc(20 * sizeof(char));
snprintf(strToSend, 20, "Hello, FreeRTOS:%d", i++);
//sprintf(strToSend,"Hello, FreeRTOS:%d",i++);
// 发送字符串指针到队列
if (xQueueSend(xQueue, &strToSend, portMAX_DELAY) != pdPASS) {
// 处理发送失败的情况
printf("vSenderTask xQueueSend fail\r\n");
}
printf("vSenderTask\r\n");
free(strToSend);
// 等待一段时间再发送下一条消息
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
8、接收任务处理
void vReceiverTask(void *pvParameters) {
char *receivedStr;
for(;;) {
// 从队列接收字符串指针
if (xQueueReceive(xQueue, &receivedStr, portMAX_DELAY) == pdTRUE) {
// 处理接收到的字符串
printf("Received string: %s\n", receivedStr);
// 如果字符串是动态分配的,需要在这里释放内存(如果适用)
//free(receivedStr); // 注意:这里不需要释放,因为receivedStr是指针,不是动态分配的内存块
// 但是,如果发送的是动态分配的字符串内容(不是指针),则需要在接收方释放
} else {
// 处理接收失败的情况
printf("vReceiverTask xQueueReceive fail\r\n");
}
printf("vReceiverTask\r\n");
// 等待一段时间再接收下一条消息
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
9、运行效果
源码:
test1.rar
(86.66 KB)
|