[活动专区] 【AT-START-L021测评】5、运行FreeRTOS

[复制链接]
 楼主| sujingliang 发表于 2024-11-25 21:10 | 显示全部楼层 |阅读模式
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源码加入工程
14.png
2、加入include路径:
  1. ..\..\..\..\middlewares\freertos\source\include
  2. ..\..\..\..\middlewares\freertos\source\portable\rvds\ARM_CM0
  3. ..\..\..\..\middlewares\freertos\source\portable\memmang
3、拷贝一个FreeRTOSConfig.h到inc下
FreeRTOSConfig.h可以从FREERTOS例程中找到。

4、将at32l021_int.c中的三个函数注释掉,如果有
因为和FreeRTOS冲突了
  1. /*
  2. void SVC_Handler(void)
  3. {
  4. }

  5. */

  6. /*
  7. void PendSV_Handler(void)
  8. {
  9. }
  10. */
  11. /*
  12. void SysTick_Handler(void)
  13. {
  14. }
  15. */
5、include port
根据编译环境选择port文件
  1. /* support ac5 and ac6 compiler */
  2. #if (__ARMCC_VERSION > 6000000)

  3. #include "..\..\..\middlewares\freertos\source\portable\GCC\ARM_CM0\port.c"

  4. #else

  5. #include "..\..\..\middlewares\freertos\source\portable\rvds\ARM_CM0\port.c"

  6. #endif
6、freertso开始
建立一个队列,一个发送信息的任务,一个接收信息的任务
  1.   /* enter critical */
  2.   taskENTER_CRITICAL();
  3.         xQueue = xQueueCreate(10, sizeof(char *));
  4.        
  5.         xTaskCreate(
  6.                         vSenderTask, // 任务函数
  7.                         "Sender",    // 任务名称
  8.                         512, // 堆栈大小
  9.                         NULL,          // 任务输入参数
  10.                         tskIDLE_PRIORITY + 1, // 任务优先级
  11.                         NULL           // 任务句柄
  12.         );
  13.         printf("Create vSenderTask\r\n");
  14.         // 创建接收任务
  15.         xTaskCreate(
  16.                         vReceiverTask, // 任务函数
  17.                         "Receiver",    // 任务名称
  18.                         512, // 堆栈大小
  19.                         NULL,          // 任务输入参数
  20.                         tskIDLE_PRIORITY + 2, // 任务优先级
  21.                         NULL           // 任务句柄
  22.         );
  23.         printf("Create vReceiverTask\r\n");
  24.        
  25.           /* exit critical */
  26.   taskEXIT_CRITICAL();
  27.         vTaskStartScheduler();
7、发送信息任务处理
  1. void vSenderTask(void *pvParameters) {
  2.     char *strToSend;
  3.     int i=0;

  4.     for(;;) {
  5.                                 strToSend = (char *)malloc(20 * sizeof(char));
  6.                                 snprintf(strToSend, 20, "Hello, FreeRTOS:%d", i++);
  7.                                         //sprintf(strToSend,"Hello, FreeRTOS:%d",i++);
  8.         // 发送字符串指针到队列
  9.         if (xQueueSend(xQueue, &strToSend, portMAX_DELAY) != pdPASS) {
  10.             // 处理发送失败的情况
  11.                                                 printf("vSenderTask xQueueSend fail\r\n");
  12.         }
  13.         printf("vSenderTask\r\n");
  14.                                
  15.                                 free(strToSend);
  16.         // 等待一段时间再发送下一条消息
  17.         vTaskDelay(pdMS_TO_TICKS(1000));
  18.     }

  19. }
8、接收任务处理
  1. void vReceiverTask(void *pvParameters) {
  2.     char *receivedStr;
  3.    
  4.     for(;;) {
  5.         // 从队列接收字符串指针
  6.         if (xQueueReceive(xQueue, &receivedStr, portMAX_DELAY) == pdTRUE) {
  7.             // 处理接收到的字符串
  8.             printf("Received string: %s\n", receivedStr);

  9.             // 如果字符串是动态分配的,需要在这里释放内存(如果适用)
  10.              //free(receivedStr); // 注意:这里不需要释放,因为receivedStr是指针,不是动态分配的内存块
  11.             // 但是,如果发送的是动态分配的字符串内容(不是指针),则需要在接收方释放
  12.         } else {
  13.             // 处理接收失败的情况
  14.                                                 printf("vReceiverTask xQueueReceive fail\r\n");
  15.         }
  16.         printf("vReceiverTask\r\n");
  17.         // 等待一段时间再接收下一条消息
  18.         vTaskDelay(pdMS_TO_TICKS(1000));
  19.     }
  20. }
9、运行效果

15.png

源码:
test1.rar (86.66 KB, 下载次数: 2)


timfordlare 发表于 2024-12-3 07:56 | 显示全部楼层
AT32L021C8T7是一款低功耗的ARM Cortex-M0微控制器,具有高达80MHz的CPU运算速度,并支持高达64KB的闪存存储器和81KB的随机存取存储器。这为运行FreeRTOS提供了足够的处理能力和存储空间。
juliestephen 发表于 2024-12-3 08:42 | 显示全部楼层
FreeRTOS是一个开源的实时操作系统,具有良好的可移植性,可以在不同的硬件平台上运行。
janewood 发表于 2024-12-6 20:21 | 显示全部楼层
引入RTOS会带来一定的性能开销,包括任务切换和上下文切换的开销。
timfordlare 发表于 2024-12-6 23:25 | 显示全部楼层
FreeRTOS具有较小的内存占用和高效的资源利用,适合在资源受限的嵌入式系统中使用。
kkzz 发表于 2024-12-7 02:28 | 显示全部楼层
AT-START-L021提供了足够的处理能力和内存资源来支持FreeRTOS的运行。它具备高性能的Cortex-M4内核和丰富的外设接口,可以满足大多数实时操作系统的需求。
yorkbarney 发表于 2024-12-7 05:30 | 显示全部楼层
通过运行FreeRTOS,可以实现多个智能家居设备的并发控制和状态监测,提高系统的响应速度和用户体验。
beacherblack 发表于 2024-12-9 09:54 | 显示全部楼层
FreeRTOS 有着成熟的内存管理机制
everyrobin 发表于 2024-12-9 12:59 | 显示全部楼层
AT32L021适用于多种低运行功耗和低待机功耗的需求,如物联网(IoT)、无线通信模块、电机控制和消费电子等。
sdlls 发表于 2024-12-9 16:01 | 显示全部楼层
FreeRTOS的跨平台支持和灵活的内存管理策略使得它能够在AT-START-L021开发板上实现高效运行。用户可以根据系统需求进行定制和优化,以满足特定应用场景的要求。
sesefadou 发表于 2024-12-10 13:29 | 显示全部楼层
设计中集成了FreeRTOS,这是一种流行的开源实时操作系统,广泛用于嵌入式系统。集成FreeRTOS可以提高系统的可靠性和响应能力,特别是在多任务处理和实时性能要求高的应用中。
timfordlare 发表于 2024-12-10 14:30 | 显示全部楼层
FreeRTOS是开源的,且对于商业用途也是免费的,这降低了开发成本。
mickit 发表于 2024-12-10 15:34 | 显示全部楼层
FreeRTOS 提供了丰富的任务调度策略,像是基于优先级抢占式调度、时间片轮转调度等。开发者可依据 AT-START-L021 项目实际需求,精准为每个任务分配优先级。
pentruman 发表于 2024-12-10 17:33 | 显示全部楼层
AT32L021系列微控制器具有快速进入和唤醒低功耗模式的能力,以及极低的待机功耗。
alvpeg 发表于 2024-12-10 18:29 | 显示全部楼层
FreeRTOS需要一定的内存来运行,特别是在多任务环境中,需要合理分配堆栈大小,以避免内存不足的问题。
chenci2013 发表于 2024-12-10 19:58 | 显示全部楼层
FreeRTOS提供了强大的任务调度和管理功能,能够有效地管理多个并发任务,确保系统的实时性和稳定性。
gygp 发表于 2024-12-10 20:29 | 显示全部楼层
FreeRTOS在AT-START-L021开发板上运行稳定吗
hilahope 发表于 2024-12-11 16:40 | 显示全部楼层
AT-START-L021的高主频和强大的处理能力可以确保流畅的任务执行和快速的响应。
wangdezhi 发表于 2024-12-12 13:43 | 显示全部楼层
FreeRTOS具有良好的可移植性,可以轻松地移植到不同的微控制器和处理器上。
biechedan 发表于 2024-12-12 14:12 | 显示全部楼层
FreeRTOS提供了丰富的API接口,方便开发者进行任务创建、删除、挂起、恢复等操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部