TL-LED 发表于 2024-5-12 13:20

【兆易GD32H759I-EVAL】FreeRTOS系统移植

本帖最后由 TL-LED 于 2024-5-12 13:19 编辑

<p><span style="font-size:16px;">学习下在GD32H759-EVAL上移植FreeRTOS系统。</span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>一、源码下载</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">官网地址:<a href="https://www.freertos.org/zh-cn-cmn-s/a00104.html" target="_blank">https://www.freertos.org/zh-cn-cmn-s/a00104.html</a></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>二、复制文件</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">将源码复制到前面创建的工程文件中</span></p>

<p><span style="font-size:16px;">2.1、复制源码</span></p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">2.2、复制配置文件</span></p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>三、添加文件到项目</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">3.1、添加源码到项目</span></p>

<p><span style="font-size:16px;"></span></p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">3.2、添加头文件</span></p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>四、程序部分</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">4.1、修改gd32h7xx_it.c</span></p>

<p><span style="font-size:16px;">屏蔽掉SVC_Handler和PendSV_Handler函数,增加滴答函数部分</span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">4.2、修改FreeRTOSConfig.h</span></p>

<p>&nbsp;</p>

<p><span style="font-size: 16px;">根据编译提示修改此文件,直到编译不报错。</span></p>

<p></p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p><strong><span style="font-size:16px;">五、测试程序</span></strong></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">5.1、fun_task.c</span></p>

<pre>
<code>#include "main.h"

#define START_TASK_PRO                1                               
#define START_STK_SIZE                128
TaskHandle_t StartTask_Handler;

#define TASK1_PRIO      4                  
#define TASK1_STK_SIZE128               
static TaskHandle_t            Task1Task_Handler = NULL;
         
#define TASK2_PRIO      3                  
#define TASK2_STK_SIZE128               
static TaskHandle_t            Task2Task_Handler = NULL;


void start_task(void *pvParameters);
void gui_task(void *pvParameters);

void task1(void *pvParameters);
void task2(void *pvParameters);


void task_create(void)
{
       
        //start_task
        xTaskCreate((TaskFunction_t )start_task,                  
                                                        (const char*    )"start_task",               
                                                        (uint16_t       )START_STK_SIZE,         
                                                        (void*          )NULL,                  
                                                        (UBaseType_t    )START_TASK_PRO,            
                                                        (TaskHandle_t*)&amp;StartTask_Handler);   

        vTaskStartScheduler();
}

void start_task(void *pvParameters)
{
        taskENTER_CRITICAL();
        //task1
        xTaskCreate((TaskFunction_t )task1,                  
                                                        (const char*    )"task1",               
                                                        (uint16_t       )TASK1_STK_SIZE,         
                                                        (void*          )NULL,                  
                                                        (UBaseType_t    )TASK1_PRIO,            
                                                        (TaskHandle_t*)&amp;Task1Task_Handler);   
        //task2
        xTaskCreate((TaskFunction_t )task2,                  
                                                        (const char*    )"task2",               
                                                        (uint16_t       )TASK2_STK_SIZE,      
                                                        (void*          )NULL,                  
                                                        (UBaseType_t    )TASK2_PRIO,            
                                                        (TaskHandle_t*)&amp;Task2Task_Handler);
        taskEXIT_CRITICAL();
        vTaskDelete(StartTask_Handler);                                               
}


//task1
void task1(void *pvParameters)
{
    while (1)
    {
      printf("task1 run ...\r\n");
      vTaskDelay(2000);
    }
}

//task2
void task2(void *pvParameters)
{
    while (1)
    {       
      printf("task2 run ...\r\n");
      vTaskDelay(1000);
    }
}</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">5.2、main.c</span></p>

<pre>
<code>#include "main.h"
#include "FreeRTOS.h"

void cache_enable(void);

int main(void)
{
        cache_enable();
        systick_config();
        init_usart(115200);
       
        task_create();
        while(1)
        {
        }
}

void cache_enable(void)
{
    /* enable i-cache */
    SCB_EnableICache();

    /* enable d-cache */
    SCB_EnableDCache();
}</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>六、程序运行</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">程序运行后,串口输出内容</span></p>

<p></p>

<p>&nbsp;</p>

lugl4313820 发表于 2024-5-12 15:05

大佬的RTOS用得非常溜呀,太强了!GD本身有freertos的示例,移植完后对比一下,有什么区别。

TL-LED 发表于 2024-5-12 15:58

lugl4313820 发表于 2024-5-12 15:05
大佬的RTOS用得非常溜呀,太强了!GD本身有freertos的示例,移植完后对比一下,有什么区别。

<p>这款例程没有找到,就直接移植了。</p>

lugl4313820 发表于 2024-5-13 07:04

<p>&nbsp; 楼主大佬,这是什么原因呀,是GD的产品有问题,还是freertos有问题,这任务调度有问题呀,是不是需要复现一下,提交给GD,这可是大BUG呀。</p>

lugl4313820 发表于 2024-5-13 07:05

<p>提交这样的报告,对freertos,也对GD产品有重大发现,太强了!</p>

TL-LED 发表于 2024-5-13 08:29

lugl4313820 发表于 2024-5-13 07:05
提交这样的报告,对freertos,也对GD产品有重大发现,太强了!

<p>这两个任务设置的时间周期是1S和2S,测试中间有重新上电,造成串口打印结果有重复,我测试完成后直接截图了,我再试下。<img height="53" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/sad.gif" width="54" /></p>

TL-LED 发表于 2024-5-13 09:19

lugl4313820 发表于 2024-5-13 07:04
&nbsp; 楼主大佬,这是什么原因呀,是GD的产品有问题,还是freertos有问题,这任务调度有问题呀,是不是需 ...

<p>操作问题。应该是测试过程中开发板重新上电了,串口助手接收数据没有清空。有时间再试下。</p>

TL-LED 发表于 2024-5-13 12:42

<p><span style="font-size:16px;">重新测试了下,没有出现上面的情况。</span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">程序源码:</span></p>

<div><span style="font-size:16px;"></span></div>

<p>&nbsp;</p>

lugl4313820 发表于 2024-5-13 17:04

TL-LED 发表于 2024-5-13 12:42
重新测试了下,没有出现上面的情况。

&nbsp;



&nbsp;

程序源码:



&nbsp;

<p>收到,大佬以后测试时注意一下,要不会给GD的产品产生一些错觉。</p>

qiuwenjie2 发表于 2024-12-20 15:41

<p>特地登录来感谢一下,我的移植一直卡在&nbsp;</p>

<p>configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY &amp; ucMaxPriorityValue ) );</p>

<p>这句话这里动不了,然后怀疑就是 Config.h这个文件,然后移植demo里面的M7的一直不行,然后看到 你成功了,然后借过来用一下,就成了,现在在找原因,起码能成了<img height="51" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/cry2.gif" width="66" /></p>

<p>&nbsp;</p>

nkml 发表于 2025-2-14 14:29

<p>大佬你好,请教个问题,为啥文件里面会有cmsis的文件呢,我看路径都没有选呢,</p>

nkml 发表于 2025-2-14 14:32

nkml 发表于 2025-2-14 14:29
大佬你好,请教个问题,为啥文件里面会有cmsis的文件呢,我看路径都没有选呢,

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

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

<div style="text-align: center;">我看过路径都没有选ARM的CMSIS文件,&nbsp; 可是文件里面又有, 您是单独添加的吗?</div>

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

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

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

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

<p>&nbsp;</p>

TL-LED 发表于 2025-2-14 16:04

nkml 发表于 2025-2-14 14:32
&nbsp;



我看过路径都没有选ARM的CMSIS文件,&nbsp; 可是文件里面又有, 您是单独添加的吗?

&n ...

<p>这个没有单独添加</p>

nkml 发表于 2025-2-18 09:53

TL-LED 发表于 2025-2-14 16:04
这个没有单独添加

<p>这个rtos操作系统,可以添加一下cmsis-v2上层接口么, 我尝试了好久都不成功- -</p>
页: [1]
查看完整版本: 【兆易GD32H759I-EVAL】FreeRTOS系统移植