dirty 发表于 2024-1-14 14:43

【CH32X035评估板】--FreeRTOS移植解读与工程使用

本帖最后由 dirty 于 2024-1-14 14:51 编辑

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在官方SDK里已经移植好了FreeRTOS、RT-Thread、HarmonyOS、TencentOS,后三个是国产的了,在使用上差不多一个套路,基本都是任务、消息队列、信号量、互斥量、软件定时器、内存管理等。对有需要使用带系统的可以使用其中之一,在此基础上做应用开发。这里选择FreeRTOS移植做下梳理及系统应用。</p>

<p>一.关于FreeRTOS系统移植</p>

<p>1.FreeRTOS内核源码</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;官方放在CH32X035EVT\EVT\EXAM\FreeRTOS\FreeRTOS_Core\FreeRTOS路径下,内核版本V10.4.6。文件结构如下:</p>

<div style="text-align: center;">
<div style="text-align: center;"></div>

<p>&nbsp;</p>
</div>

<div style="text-align: center;">图1:FreeRTOS文件结构</div>

<p>2.系统移植解读</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在FreeRTOS根目录下有两个文件夹①①及C文件③。编号①和③包含的是 FreeRTOS 的通用的头文件和 C 文件,这两部分的文件试用于各种编译器和处理器,是通用的。需要移植的头文件和 C 文件及汇编文件放在编号②portblle 这个文件夹,汇编接口文件一般原厂会对接好。</p>

<div style="text-align: center;">
<div style="text-align: center;"></div>

<p>&nbsp;</p>
</div>

<div style="text-align: center;">图2:FreeRTOS下portable目录</div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在portable\GCC\RISC-V下①port.c与portmacro.h及上下文切换代码汇编portASM.S,官方已经把这些底层移植已做好。②MemMang 文件夹下存放的是跟内存管理相关的,这里选了heap_4.c动态内存分配。</p>

<p>&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在MounRiver Studio IDE菜单栏Project-&gt;Properties里同样已经配置好RiSCV编译器等,开发人员基本不用改动即可直接使用。</p>

<p>&nbsp;</p>

<p>二.关于FreeRTOS使用</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于熟悉RTOS使用的小伙伴来说,经常项目工程使用会比较轻车熟路。下面设计创建二值信号量,一个任务里发送信号,一个任务里接收信号,并控制LED1亮灭状态翻转、</p>

<p>1.创建二值信号量</p>

<pre>
<code>//二值信号量
SemaphoreHandle_t BinarySem_Handle =NULL;

        /* 创建 BinarySem */
        BinarySem_Handle = xSemaphoreCreateBinary();
        if (NULL != BinarySem_Handle)
        {
                printf("BinarySem_Handle Create OK\r\n");
        }
        else
        {
                printf("BinarySem_Handle Create Fail\r\n");
        }
        </code></pre>

<p>2.任务处理</p>

<p>任务2发送信号量</p>

<pre>
<code>void task2_task(void *pvParameters)
{
    BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */

    while(1)
    {

      xReturn = xSemaphoreGive( BinarySem_Handle );//给出二值信号量
      if ( xReturn == pdTRUE )
      {
            printf("\r\nGive BinarySem_Handle OK!\r\n");
      }
      else
      {
            printf("\r\nGive BinarySem_Handle Fail!\r\n");
      }

      vTaskDelay(2000);

    }
}</code></pre>

<p>任务1接收信号量并控灯</p>

<pre>
<code>void task1_task(void *pvParameters)
{

        uint8_t led_status;
    while(1)
    {
       //获取二值信号量 xSemaphore,没获取到则一直等待
                if(xSemaphoreTake(BinarySem_Handle,portMAX_DELAY)==pdTRUE)//
                {
                        printf("Take BinarySem_Handle OK \r\n");

                led_status=GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);
                GPIO_WriteBit(GPIOA, GPIO_Pin_0, (led_status == 0) ? (led_status=Bit_SET):(led_status=Bit_RESET));
                printf("Led Toggle!\r\n");
                if(led_status)
                {
                  printf("now led_status OFF\r\n");
                }
                else
                {
                  printf("now led_status ON\r\n");
                }

                }

    }
}
</code></pre>

<p>3.编译烧录,查看日志及LED灯状态</p>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">图3:FreeRTOS运行日志</div>

<div style="text-align: center;">&nbsp;</div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以看到 信号量的发送与接收以及任务键执行情况,LED灯亮灭状态切换。至此FreeRTOS得到成功应用。</p>

<div style="text-align: center;">&nbsp;</div>

<p>&nbsp;</p>

Jacktang 发表于 2024-1-15 07:49

<p>有关FreeRTOS的使用主要是创建二值信号量,确实如此的</p>

dirty 发表于 2024-1-17 22:21

Jacktang 发表于 2024-1-15 07:49
有关FreeRTOS的使用主要是创建二值信号量,确实如此的

<p>是的,关于系统方面是比较范式的用法,按需使用。</p>
页: [1]
查看完整版本: 【CH32X035评估板】--FreeRTOS移植解读与工程使用