【兆易GD32H759I-EVAL】FreeRTOS系统移植
本帖最后由 TL-LED 于 2024-5-12 13:19 编辑<p><span style="font-size:16px;">学习下在GD32H759-EVAL上移植FreeRTOS系统。</span></p>
<p> </p>
<p><span style="font-size:16px;"><strong>一、源码下载</strong></span></p>
<p> </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> </p>
<p><span style="font-size:16px;"><strong>二、复制文件</strong></span></p>
<p> </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> </p>
<p><span style="font-size:16px;">2.2、复制配置文件</span></p>
<p><span style="font-size:16px;"></span></p>
<p> </p>
<p><span style="font-size:16px;"><strong>三、添加文件到项目</strong></span></p>
<p> </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> </p>
<p><span style="font-size:16px;"></span></p>
<p> </p>
<p><span style="font-size:16px;">3.2、添加头文件</span></p>
<p><span style="font-size:16px;"></span></p>
<p> </p>
<p><span style="font-size:16px;"><strong>四、程序部分</strong></span></p>
<p> </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> </p>
<p><span style="font-size:16px;">4.2、修改FreeRTOSConfig.h</span></p>
<p> </p>
<p><span style="font-size: 16px;">根据编译提示修改此文件,直到编译不报错。</span></p>
<p></p>
<p> </p>
<p></p>
<p> </p>
<p><strong><span style="font-size:16px;">五、测试程序</span></strong></p>
<p> </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*)&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*)&Task1Task_Handler);
//task2
xTaskCreate((TaskFunction_t )task2,
(const char* )"task2",
(uint16_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_PRIO,
(TaskHandle_t*)&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> </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> </p>
<p><span style="font-size:16px;"><strong>六、程序运行</strong></span></p>
<p> </p>
<p><span style="font-size:16px;">程序运行后,串口输出内容</span></p>
<p></p>
<p> </p>
大佬的RTOS用得非常溜呀,太强了!GD本身有freertos的示例,移植完后对比一下,有什么区别。 lugl4313820 发表于 2024-5-12 15:05
大佬的RTOS用得非常溜呀,太强了!GD本身有freertos的示例,移植完后对比一下,有什么区别。
<p>这款例程没有找到,就直接移植了。</p>
<p> 楼主大佬,这是什么原因呀,是GD的产品有问题,还是freertos有问题,这任务调度有问题呀,是不是需要复现一下,提交给GD,这可是大BUG呀。</p>
<p>提交这样的报告,对freertos,也对GD产品有重大发现,太强了!</p>
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>
lugl4313820 发表于 2024-5-13 07:04
楼主大佬,这是什么原因呀,是GD的产品有问题,还是freertos有问题,这任务调度有问题呀,是不是需 ...
<p>操作问题。应该是测试过程中开发板重新上电了,串口助手接收数据没有清空。有时间再试下。</p>
<p><span style="font-size:16px;">重新测试了下,没有出现上面的情况。</span></p>
<p> </p>
<p><span style="font-size:16px;"></span></p>
<p> </p>
<p><span style="font-size:16px;">程序源码:</span></p>
<div><span style="font-size:16px;"></span></div>
<p> </p>
TL-LED 发表于 2024-5-13 12:42
重新测试了下,没有出现上面的情况。
程序源码:
<p>收到,大佬以后测试时注意一下,要不会给GD的产品产生一些错觉。</p>
<p>特地登录来感谢一下,我的移植一直卡在 </p>
<p>configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & 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> </p>
<p>大佬你好,请教个问题,为啥文件里面会有cmsis的文件呢,我看路径都没有选呢,</p>
nkml 发表于 2025-2-14 14:29
大佬你好,请教个问题,为啥文件里面会有cmsis的文件呢,我看路径都没有选呢,
<div style="text-align: center;"> </div>
<div style="text-align: center;"></div>
<div style="text-align: center;">我看过路径都没有选ARM的CMSIS文件, 可是文件里面又有, 您是单独添加的吗?</div>
<div style="text-align: center;"> </div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p> </p>
</div>
<div style="text-align: center;"> </div>
<p> </p>
nkml 发表于 2025-2-14 14:32
我看过路径都没有选ARM的CMSIS文件, 可是文件里面又有, 您是单独添加的吗?
&n ...
<p>这个没有单独添加</p>
TL-LED 发表于 2025-2-14 16:04
这个没有单独添加
<p>这个rtos操作系统,可以添加一下cmsis-v2上层接口么, 我尝试了好久都不成功- -</p>
页:
[1]