sujingliang 发表于 2024-11-25 21:10

【AT-START-L021测评】5、运行FreeRTOS

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"

#endif6、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、运行效果



源码:



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接口,方便开发者进行任务创建、删除、挂起、恢复等操作。
页: [1] 2
查看完整版本: 【AT-START-L021测评】5、运行FreeRTOS