参考正点原子UCOSII的移植教程,在此基础上进行GD32F303的UCOSII移植,并将过程分享出来,希望可以帮助到大家。
1.首先需要一个GD32可以运行的工程文件,我在其中已经写好了一个串口与一个LED灯的初始化程序(方便观测移植是否成功)。
2.打开正点原子的UCOSII例程
将其中UCOSII复制到准备好的工程文件中,其中包含这三个文件夹。![](https://i-blog.csdnimg.cn/blog_migrate/ae78956add9605575bcbfa971a366748.png)
然后将其添加到工程中
再在编译界面添加三个文件夹
3.将正点原子的DELAY文件夹拷贝到工程里,并且添加相关路径。(这一点很重要,因为涉及到任务的切换以及滴答定时器的初始化,都在这里有现成的,我自己写不出来所以只能拷贝了)
3.1
在项目中添加文件夹并且添加相关文件
3.2在工程中添加根目录
3.3修改delay文件
修改时钟函数
3.4在delay.h 中添加头文件
#include "gd32f30x.h"
#include "systick.h"
4 修改报错
4.1修改完DELAY后直接编译,编译出错,提示找不到stm32f10x.h 因为从正点原子例程中直接拷贝过来的,我们用的芯片是gd32f303,所以定位到错误地址,修改成 #include <gd32f30x.h>
4.2注释gd32f30x.c中的 PendSV_Handler SysTick_Handler 这两个函数
5.主函数中创建任务,代码如下
#include "gd32f30x.h"
#include "systick.h"
#include <stdio.h>
#include "delay.h"
#include "includes.h"
//START ÈÎÎñ
//ÉèÖÃÈÎÎñÓÅÏȼ¶
#define START_TASK_PRIO 10 ///¿ªÊ¼ÈÎÎñµÄÓÅÏȼ¶Îª×îµÍ
//ÉèÖÃÈÎÎñ¶ÑÕ»´óС
#define START_STK_SIZE 128
//ÈÎÎñÈÎÎñ¶ÑÕ»
OS_STK START_TASK_STK[START_STK_SIZE];
//ÈÎÎñº¯Êý
void start_task(void *pdata);
//LED0ÈÎÎñ
//ÉèÖÃÈÎÎñÓÅÏȼ¶
#define LED0_TASK_PRIO 7
//ÉèÖÃÈÎÎñ¶ÑÕ»´óС
#define LED0_STK_SIZE 128
//ÈÎÎñ¶ÑÕ»
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//ÈÎÎñº¯Êý
void led0_task(void *pdata);
//LED1ÈÎÎñ
//ÉèÖÃÈÎÎñÓÅÏȼ¶
#define LED1_TASK_PRIO 6
//ÉèÖÃÈÎÎñ¶ÑÕ»´óС
#define LED1_STK_SIZE 128
//ÈÎÎñ¶ÑÕ»
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//ÈÎÎñº¯Êý
void led1_task(void *pdata);
int main(void)
{
rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1);//ÉèÖÃÖ÷Ƶ120M(#define __SYSTEM_CLOCK_120M_PLL_HXTAL (uint32_t)(120000000),8MÍⲿ¾§Õñ (#define HXTAL_VALUE ((uint32_t)8000000))
delay_init();
rcu_periph_clock_enable(RCU_AF); //AFʱÖÓʹÄÜ
delay_ms(1000);//µÈ´ý1000ms
gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE);//ÏÂÔØ¿ÚNJTRSTÒý½Åµ±×öÆÕͨI/O¿Ú
rcu_periph_clock_enable(RCU_GPIOB);//PBʱÖÓʹÄÜ
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//PB4ÅäÖóÉÊä³ö
OSInit(); //UCOS³õʼ»¯
OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //´´½¨¿ªÊ¼ÈÎÎñ
OSStart(); //¿ªÊ¼ÈÎÎñ
// while(1)
// {
// delay_1ms(100);//µÈ´ý1000ms
// gpio_bit_set(GPIOB, GPIO_PIN_4);//Êä³ö¸ß
// delay_1ms(100);
// gpio_bit_reset(GPIOB, GPIO_PIN_4);//Êä³öµÍ
// }
return 0;
}
//¿ªÊ¼ÈÎÎñ
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata=pdata;
OSStatInit(); //¿ªÆôͳ¼ÆÈÎÎñ
OS_ENTER_CRITICAL(); //½øÈëÁÙ½çÇø(¹Ø±ÕÖжÏ)
OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);//´´½¨LED0ÈÎÎñ
OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);//´´½¨LED1ÈÎÎñ
//OSTaskCreate(float_task,(void*)0,(OS_STK*)&FLOAT_TASK_STK[FLOAT_STK_SIZE-1],FLOAT_TASK_PRIO);//´´½¨¸¡µã²âÊÔÈÎÎñ
OSTaskSuspend(START_TASK_PRIO);//¹ÒÆð¿ªÊ¼ÈÎÎñ
OS_EXIT_CRITICAL(); //Í˳öÁÙ½çÇø(¿ªÖжÏ)
}
//LED0ÈÎÎñ
void led0_task(void *pdata)
{
while(1)
{
gpio_bit_set(GPIOB, GPIO_PIN_4);//Êä³ö¸ß
delay_ms(500);
}
}
//LED1ÈÎÎñ
void led1_task(void *pdata)
{
while(1)
{
delay_ms(300);
gpio_bit_reset(GPIOB, GPIO_PIN_4);//Êä³öµÍ
delay_ms(300);
}
}
PB4按程序逻辑正常闪烁,移植成功