GD32F303移植UCOSII

参考正点原子UCOSII的移植教程,在此基础上进行GD32F303的UCOSII移植,并将过程分享出来,希望可以帮助到大家。

1.首先需要一个GD32可以运行的工程文件,我在其中已经写好了一个串口与一个LED灯的初始化程序(方便观测移植是否成功)。

2.打开正点原子的UCOSII例程

将其中UCOSII复制到准备好的工程文件中,其中包含这三个文件夹。

 然后将其添加到工程中

 

再在编译界面添加三个文件夹

 

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按程序逻辑正常闪烁,移植成功

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407移植uCos II是将uCos II实时操作系统移植到STM32F407系列微控制器上的过程。移植uCos II可以使嵌入式系统具备多任务处理和实时性能,提高系统的可靠性和灵活性。 首先,需要在STM32F407上配置系统时钟和外设,以便与uCos II进行通信。可以使用寄存器级别的编程技术来配置时钟和外设,建立与uCos内核的通信。 其次,需要为STM32F407编写适配器代码,以实现与uCos II内核的接口。适配器代码主要包括时钟中断处理函数、任务切换函数、内存管理函数等。这些函数需要根据具体的硬件特性来编写。 然后,需要对STM32F407上的存储器进行划分,为uCos II的内核堆栈、任务堆栈和其他数据结构分配内存空间。 接下来,需要将uCos II的源代码添加到项目中,并根据需要进行配置和编译。可以根据系统的需求选择合适的uCos II配置选项,并根据实际情况配置任务、消息队列、信号量等。 最后,在主函数中初始化uCos II内核,并创建任务。可以根据系统的需要创建不同的任务,并设置其优先级和堆栈大小。 总的来说,STM32F407移植uCos II的过程包括配置系统时钟和外设、编写适配器代码、分配存储器空间、添加源代码、配置和编译、初始化内核和创建任务等步骤。通过这些步骤,可以成功地将uCos II移植到STM32F407系列微控制器上,实现多任务处理和实时性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值