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, 下载次数: 2)
|
|