GD32F103*固件库移植μCOS-Ⅲ详细教程与解析(最终版本已上传,可下载)

GD32F103*固件库移植μCOS-Ⅲ详细教程与解析(最终版本已上传,可下载)

GD32F103*移植μCOS-Ⅲ详细教程与解析,欢迎指正


文章目录

  • GD32F103*固件库移植μCOS-Ⅲ详细教程与解析(最终版本已上传,可下载)
  • 前言
  • 一、移植前的准备
  • 二、移植步骤
    • 1.文件结构
    • 2.添加代码
    • 3.系统配置
      • 1.中断配置
      • 2. µC/OS-III 相关组件配置
    • 4.注意事项
  • 总结


前言

μcos-III是一个可以基于ROM运行的、可裁剪的、抢占式、实时多任务内核,具有高度可移植性,特点:公开源代码、可移植性、可固化、可裁剪、多任务、占先式,特别适合于微处理器和控制器,适合很多商业操作系统性能相当的实时操作系统(RTOS)。在使用GD32F103单片机项目使用过μcos-III,这里作为一个基础教学版简单记录一下移植过程,欢迎大佬指正!!!!

最终成果放在此处,欢迎大家下载!后续上传git会更新


一、移植前的准备

<1>、硬件平台:可运行软件程序的GD32单片机(本项目使用GD32F103RET6硬件平台)
<2>、软件平台:可直接下载运行的单片机基础工程,本例程是基于使用标准库GD32F10x_Firmware_Library_V2.2.4固件库编写,点击此处可直接获取本试验基础工程
<3>、源码获取:μCOS源码(本例程使用μCOS源码版本为:uC-CPU-1.32.01/uC-LIB-1.39.01/uC-OS3-3.08.01)点此GitHub获取或点此免费获取
<4>、J-link或ST-link等下载器

二、移植步骤

1.文件结构

1.在基础工程目录下新建文件夹uCOS3,再在uCOS3文件夹下新建uC-CPU、uC-LIB、uC-OS分别保存OS的三份源码文件。(注意是’u’而不是’μ’,误写成’μ’可能因非法字符路径导致编译调试出问题)
2.打开基础工程新建三个以下四个分组。然后严格按照以下步骤去添加文件。
在这里插入图片描述
■将 uCCPU/BSP/Template/bsp_cpu.c 和 uC-OS3/Template/bsp_os_dt.c 这 个 两 个 文 件 添 加 到uC-OS3/BSP 分组中;

■C-CPU/ARM-Cortex-M/ARMv7-M/ARM/cpu_a.asm、 uC-CPU\ARM-Cortex-M\ARMv7-M\cpu_c.c 和 uC-CPU/cpu_core.c,将以上三个文件添加到 uC-OS3/CPU 分组中

■uC-LIB/lib_ascii.c、 uC-LIB/lib_math.c、 uC-LIB/lib_mem.c 和 uC-LIB/lib_str.c,将以上四个文件添加到 uC-OS3/LIB 分组中

■uC-OS3/Cfg/Template/os_app_hooks.c 、 uC-OS3/Ports/ARM-Cortex-M/ARMv7-M/ARM/os_cpu_a.asm、 uC-OS3/Ports/ARM-Cortex-M/ARMv7-M/os_cpu_c.c 以及 uC-OS3/Source目录下除__dbg_uCOS-III.c 外的所有 C 源文件,将以上列出的共十九个文件添加到/uC-OS3/OS3 分组中

完成后如图所示
在这里插入图片描述
3.添加头文件路径,Target-C/C++下,添加如下8个头文件路径
在这里插入图片描述
4.新建四个文件名字分别是system_cfg.c和system_cfg.h,uCOS_main.c和uCOS_main.h都保存到main.c所在目录下。system_cfg.c和system_cfg.h文件主要是包含一些全局的自定义配置。uCOS_main.c和uCOS_main.h主要是OS的任务启动、调度函数等,这样划分的主要目的是使得系统main函数和OS的main函数分开,结构会很清晰明朗,系统启动会进入系统main函数初始化各个外设组件和软件模块,然后再进入OS的main中进行任务调度,以下会详细说明各个文件的作用和内容。
tps://img-blog.csdnimg.cn/be943f9558cc444187d7296eca83b8e5.png)
5.如图将system_cfg.c和uCOS_main.c文件添加到user组件下方。
在这里插入图片描述

至此我们的文件结构雏形已经完成,接下来就是添加代码,修改配置。

2.添加代码

1.system_cfg.c主要是系统配置需要的文件,本例程中主要配置主要都在system_cfg.h文件中,所以system_cfg.c文件中的内容之包含system_cfg.h头文件,其他内容可先空着方便后续补充。

代码如下(示例):

/**
 ****************************************************************************************************
 * @file          system_cfg.c
 * @author        Awen_
 * @version       V1.0
 * @date          2023-04-13
 * @brief         system config file
 * @license
 * @modifyRecord:
 *                V1.0  XXX  XXXX-XX-XX Modify...
 *                V2.0  XXX  XXXX-XX-XX Modify...
 ****************************************************************************************************
 * @attention  :
 *                Hardware Testing Platform:兆易创新(GigaDevice)  GD32F103RE
 *                Software Support Package :GD32F10x_Firmware_Library_V2.2.4
 *                
 ****************************************************************************************************
 */
#include "system_cfg.h"

2.system_cfg.c主要是系统配置需要的文件,本例程中主要配置主要都在system_cfg.h文件中,这里的内容是我自己写的,不必完全参考,其他内容也可自己补充

代码如下(示例):

/**
 ****************************************************************************************************
 * @file          system_cfg.c
 * @author        Awen_
 * @version       V1.0
 * @date          2023-04-13
 * @brief         system Initialization configuration
 * @license
 * @modifyRecord:
 *                V1.0  XXX  XXXX-XX-XX Modify...
 *                V2.0  XXX  XXXX-XX-XX Modify...
 ****************************************************************************************************
 * @attention  :
 *                Hardware Testing Platform:兆易创新(GigaDevice)  GD32F103RE
 *                Software Support Package :GD32F10x_Firmware_Library_V2.2.4
 * 
 ****************************************************************************************************
 */

#ifndef __SYS_H
#define __SYS_H

#include <stdio.h>
#include <gd32f10x.h>
#include <systick.h>
#include "gd32f10x_libopt.h"


#define SYSTEM_SUPPORT_OS		  1	  //定义系统文件夹是否支持OS
#define SYSTEM_SUPPORT_DEBUG      1   //是否支持串口打印调试

/*
*********************************************************************************************************
*                                       如果使用ucos,则包括下面的头文件即可
*********************************************************************************************************
*/
#if SYSTEM_SUPPORT_OS
  //#include "includes.h"	//ucos-2 使用
  #include "os.h"					//ucos-3 使用
#endif

/*
*********************************************************************************************************
*                                       如果使用ucos,则包括下面的头文件即可
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                                  定义返回值类型  
*********************************************************************************************************
*/
typedef uint8_t  ReturnType_u8;
typedef uint16_t ReturnType_u16;
typedef uint32_t ReturnType_u32;

/*
*********************************************************************************************************
*                                                  获取数组长度宏  
*********************************************************************************************************
*/
#define ARRAYNUM(arr_name)     (uint32_t)(sizeof(arr_name) / sizeof(*(arr_name)))
/*
*********************************************************************************************************
*                                   如果使用串口Debug,则定义SYSTEM_SUPPORT_DEBUG 1
*********************************************************************************************************
*/
#ifdef SYSTEM_SUPPORT_DEBUG
  #define Debug  			printf
#else
  #define Debug(...)  do{ }while(0)
#endif

/*
*********************************************************************************************************
*                                                  定义空指针类型
*********************************************************************************************************
*/
#define NULL_PTR  ((void*)0)

/*
*********************************************************************************************************
*                                                  定义错误代号
*********************************************************************************************************
*/
#ifndef E_OK
  #define E_OK  0U
#endif

#ifndef E_NOT_OK
  #define E_NOT_OK  1U
#endif



#endif

3.uCOS_main.h文件主要作为uCOS_main.c的头文件,uc_os3_main(void)函数作为uc_os3系统的入口,可在uCOS_main.c中实现,以供main函数调用,也可自己添加一些OS的配置

/**
 ****************************************************************************************************
 * @file        uc-os3_main.h
 * @author      Awen_
 * @version     V2.0
 * @date        2023-06-13
 * @brief       uC/OS-III 实验
 * @license     Copyright (c) 2020-2032, 
 ****************************************************************************************************
 * @attention
 *
 *
 ****************************************************************************************************
 */
#ifndef __UC_OS3_MAIN_H
#define __UC_OS3_MAIN_H

#include "system_cfg.h"
/*uC/OS-III*********************************************************************************************/
#include "os.h"
#include "cpu.h"

extern void uc_os3_main(void);

#endif

4.uCOS_main.c文件就是OS的主场,uc_os3_main(void)的实现,系统启动,创建任务,任务函数都是在这里实现,此处给出一个简单的例程,不必深究内容,大意就是创建了三个优先级不同的任务,分别闪灯和usart0输出点内容。这里可直节复制粘贴即可,先不必深究内容。

/**
 ****************************************************************************************************
 * @file          uCOS_main.c
 * @author        Awen_
 * @version       V1.0
 * @date          2023-04-13
 * @brief         Hardware IO Initialization configuration
 * @license
 * @modifyRecord:
 *                V1.0  XXX  XXXX-XX-XX Modify...
 *                V2.0  XXX  XXXX-XX-XX Modify...
 ****************************************************************************************************
 * @attention  :
 *                Hardware Testing Platform:兆易创新(GigaDevice)  GD32F103RE
 *                Software Support Package :GD32F10x_Firmware_Library_V2.2.4
 * 
 ****************************************************************************************************
 */
 
 
 /*
*****************************************************************************************************
*                                                Header Flie
*****************************************************************************************************
*/

#include "uCOS_main.h"
/*Peripheral Header file*/
#include "IOHard_cfg.h"
#include "usart_cfg.h"

/******************************************************************************************************/
/*uC/OS-III配置*/
#define START_TASK_PRIO 5
#define START_TASK_STACK_SIZE 256

#define TASK1_PRIO 2
#define TASK1_STACK_SIZE 256

#define TASK2_PRIO 3
#define TASK2_STACK_SIZE 256

#define TASK3_PRIO 4
#define TASK3_STACK_SIZE 256


/* START_TASK 任务 配置
 * 包括: 任务优先级 任务栈大小 任务控制块 任务栈任务函数
 */
CPU_STK   START_TASK_STACK[START_TASK_STACK_SIZE];
OS_TCB    StartTask_Tcp;    //起始任务控制块
void start_task(void *p_arg);

//CPU_STK*  TASK2_STACK;
static  CPU_STK  TASK1_Stack[TASK1_STACK_SIZE];
OS_TCB    Task1_Tcp;        //任务1控制块
void task1(void *p_arg);

//CPU_STK*  TASK2_STACK;
static  CPU_STK  TASK2_Stack[TASK2_STACK_SIZE];
OS_TCB    Task2_Tcp;        //任务2控制块
void task2(void *p_arg);

//CPU_STK*  TASK3_STACK;
static  CPU_STK  TASK3_Stack[TASK3_STACK_SIZE];
OS_TCB    Task3_Tcp;        //任务3控制块
void task3(void *p_arg);

OS_FLAG_GRP Event_Flag;

/**
 * @brief       uC/OS-III main.c 入口函数
 * @param       无         
 * @retval      无
 */
void uc_os3_main(void)
{
    OS_ERR err;
    
    /* 初始化uC/OS-III*/
    OSInit(&err);
    
    OSTaskCreate(   (OS_TCB*)         &StartTask_Tcp,                             /*指向任务控制块的指针*/ 
                    (CPU_CHAR*)       "start_task",                               /*指向任务名字*/
                    (OS_TASK_PTR)     start_task,                                 /*指向任务函数的指针*/
                    (void*)           0,                                          /*传递给任务函数的参数*/
                    (OS_PRIO)         TASK1_PRIO,                                 /*任务优先级,越小优先级越高*/
                    (CPU_STK*)        &START_TASK_STACK[0],                       /*指向任务栈的起始地址指针*/
                    (CPU_STK_SIZE)    START_TASK_STACK_SIZE/10,                   /*任务使用的警戒线*/
                    (CPU_STK_SIZE)    START_TASK_STACK_SIZE,                      /*任务堆栈大小*/
                    (OS_MSG_QTY)      0,                                          /*任务内嵌消息队列的大小*/
                    (OS_TICK)         0,                                          /*任务时间片*/
                    (void*)           0,                                          /*指向用户扩展内存的指针*/
                    (OS_OPT)          (OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR),  /*任务选项共5个*/
                    (OS_ERR*)         &err);                                      /*指向接收错误代码变量指针*/
    
    
    /* 开始任务调度 */
    OSStart(&err);    
}


void start_task(void *p_arg)
{
    OS_ERR  err;
    CPU_INT32U cntr = 0;
    cntr = rcu_clock_freq_get(CK_SYS) / OS_CFG_TICK_RATE_HZ;
  
    CPU_Init();
    OS_CPU_SysTickInit(cntr);
    Debug("start_Task Running****!!!!\r\n\n");
  
    OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
                    
    /*高优先级任务1*/
    //TASK1_STACK = mymalloc(SRAMIN,TASK1_STACK_SIZE * sizeof(CPU_STK));
    OSTaskCreate(   (OS_TCB*)         &Task1_Tcp,                                 /*指向任务控制块的指针*/ 
                    (CPU_CHAR*)       "task1",                                    /*指向任务名字*/
                    (OS_TASK_PTR)     task1,                                      /*指向任务函数的指针*/
                    (void*)           0,                                          /*传递给任务函数的参数*/
                    (OS_PRIO)         TASK1_PRIO,                                 /*任务优先级,越小优先级越高*/
                    (CPU_STK*)        TASK1_Stack,                                /*指向任务栈的起始地址指针*/
                    (CPU_STK_SIZE)    TASK1_STACK_SIZE/10,                        /*任务使用的警戒线*/
                    (CPU_STK_SIZE)    TASK1_STACK_SIZE,                           /*任务堆栈大小*/
                    (OS_MSG_QTY)      0,                                          /*任务内嵌消息队列的大小*/
                    (OS_TICK)         0,                                          /*任务时间片*/
                    (void*)           0,                                          /*指向用户扩展内存的指针*/
                    (OS_OPT)          (OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR),  /*任务选项共5个*/
                    (OS_ERR*)         &err);
                    
    /*中优先级任务2*/
    //TASK2_STACK = mymalloc(SRAMIN,TASK2_STACK_SIZE * sizeof(CPU_STK));
    OSTaskCreate(   (OS_TCB*)         &Task2_Tcp,                                 /*指向任务控制块的指针*/ 
                    (CPU_CHAR*)       "task2",                                    /*指向任务名字*/
                    (OS_TASK_PTR)     task2,                                      /*指向任务函数的指针*/
                    (void*)           0,                                          /*传递给任务函数的参数*/
                    (OS_PRIO)         TASK2_PRIO,                                 /*任务优先级,越小优先级越高*/
                    (CPU_STK*)        TASK2_Stack,                                /*指向任务栈的起始地址指针*/
                    (CPU_STK_SIZE)    TASK2_STACK_SIZE/10,                        /*任务使用的警戒线*/
                    (CPU_STK_SIZE)    TASK2_STACK_SIZE,                           /*任务堆栈大小*/
                    (OS_MSG_QTY)      0,                                          /*任务内嵌消息队列的大小*/
                    (OS_TICK)         0,                                          /*任务时间片*/
                    (void*)           0,                                          /*指向用户扩展内存的指针*/
                    (OS_OPT)          (OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR),  /*任务选项共5个*/
                    (OS_ERR*)         &err);
                    
    /*中优先级任务3*/                
    //TASK3_STACK = mymalloc(SRAMIN,TASK1_STACK_SIZE * sizeof(CPU_STK));
    OSTaskCreate(   (OS_TCB*)         &Task3_Tcp,                                 /*指向任务控制块的指针*/ 
                    (CPU_CHAR*)       "task3",                                    /*指向任务名字*/
                    (OS_TASK_PTR)     task3,                                      /*指向任务函数的指针*/
                    (void*)           0,                                          /*传递给任务函数的参数*/
                    (OS_PRIO)         TASK3_PRIO,                                 /*任务优先级,越小优先级越高*/
                    (CPU_STK*)        TASK3_Stack,                                /*指向任务栈的起始地址指针*/
                    (CPU_STK_SIZE)    TASK3_STACK_SIZE/10,                        /*任务使用的警戒线*/
                    (CPU_STK_SIZE)    TASK3_STACK_SIZE,                           /*任务堆栈大小*/
                    (OS_MSG_QTY)      0,                                          /*任务内嵌消息队列的大小*/
                    (OS_TICK)         0,                                          /*任务时间片*/
                    (void*)           0,                                          /*指向用户扩展内存的指针*/
                    (OS_OPT)          (OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR),  /*任务选项共5个*/
                    (OS_ERR*)         &err);
                    
                  
    //删除自己
    OSTaskDel((OS_TCB*)0, &err);   
}

/*高优先级任务*/
void task1(void *p_arg)
{
   OS_ERR  err;
  
   while(1)
   {
    //Usart_SendMsg(UART_0,&arr);
    Debug("Tsak1 running !!!! \r\n\n");
    OSTimeDly(1000,OS_OPT_TIME_DLY,&err);
    gpio_bit_set(GPIOC,GPIO_PIN_7);
    OSTimeDly(1000,OS_OPT_TIME_DLY,&err);
    gpio_bit_reset(GPIOC,GPIO_PIN_7);
   }
}

/*低优先级任务*/
void task2(void *p_arg)
{
   OS_ERR  err;
  
   while(1)
   {
     Debug("Tsak2 running !!!! \r\n\n");
     OSTimeDly(500,OS_OPT_TIME_DLY,&err);
     gpio_bit_set(GPIOC,GPIO_PIN_9);
     OSTimeDly(500,OS_OPT_TIME_DLY,&err);
     gpio_bit_reset(GPIOC,GPIO_PIN_9);
   }
}


/*高优先级任务*/
void task3(void *p_arg)
{
   OS_ERR  err;
  
   while(1)
   {
    Debug("Tsak3 running !!!! \r\n\n");
    OSTimeDly(200,OS_OPT_TIME_DLY,&err);
    gpio_bit_set(GPIOC,GPIO_PIN_8);
    OSTimeDly(200,OS_OPT_TIME_DLY,&err);
    gpio_bit_reset(GPIOC,GPIO_PIN_8);
   }
}

5.最后说说main.c文件,主要是系统初始化和硬件初始化,然后通过调用uc_os3_main(void)函数进入系统

/**
 ****************************************************************************************************
 * @file          main.c
 * @author        Awen_
 * @version       V1.0
 * @date          2023-04-13
 * @brief         main.c
 * @license
 * @modifyRecord:
 *                V1.0  XXX  XXXX-XX-XX Modify...
 *                V2.0  XXX  XXXX-XX-XX Modify...
 ****************************************************************************************************
 * @attention  :
 *                Hardware Testing Platform:兆易创新(GigaDevice)  GD32F103RE
 *                Software Support Package :GD32F10x_Firmware_Library_V2.2.4
 *                μC-OS-III :uC-CPU-1.32.01/uC-LIB-1.39.01/uC-OS3-3.08.01
 ****************************************************************************************************
 */
/***********************************************************************
 *功能块说明:Include
 ***********************************************************************/
#include "system_cfg.h"
/*uCOS-3 Header file*/
#include "uCOS_main.h"
/*Peripheral Header file*/
#include "IOHard_cfg.h"
#include "usart_cfg.h"

/*
*****************************************************************************************************
 *功能块说明:宏定义
 ****************************************************************************************************
*/


/*
*****************************************************************************************************
 *功能块说明:全局变量定义
 ****************************************************************************************************
*/


/*
*****************************************************************************************************
 *功能块说明:静态局部变量定义
 ****************************************************************************************************
*/

 
/**********************************************************************
 *1-函数名:main
 *2-函数功能:
 *3-输入参数:无
 *4-返回值:int
 *5-输入全局变量:无
 *6-输出全局变量:无
 *7-创建者与创建日期:Awen_ 2023-06-26
 **********************************************************************/
int main(int argc,char* argv[])
{
  SystemInit();
  IoHwAb_Init();
  Usart0_Init();

  uc_os3_main();
  
  while(1)
  {
     Debug("Enter μCOS-3 Failed !!!!\n\t");
     Debug("While .....   !!!!\n\t");
  }
}

3.系统配置

1.中断配置

μCOS与系统相关的主要有两个非常重要的中断,一个是提供OS系统时基的滴答定时器(SysTick_Handler中断),另一个是跟任务调度有关的(PendSVHandler中断),都在gd32f1xx_it.c 、gd32f1xx_it.h以及startup_gd32f10x_hd.s文件中。一般来讲,进入系统运行后这两个中断都应该调用OS系统的os_cpu.h所定义的中断函数(入下所示),但是这样需要修改startup_gd32f10x_hd.s启动文件,将void PendSVHandler(void)和void SysTick_Handler(void)这两个中断函数名进行修改 。

void  OS_CPU_SysTickHandler (void);
void  OS_CPU_PendSVHandler  (void);

为了修改简单和清晰,我们选择直接在gd32f1xx_it.c中的SysTick_Handler函数和PendSVHandler函数下分别调用这两个OS函数,将void PendSVHandler(void)和void SysTick_Handler(void)处修改为如下:(等效跳转到系统中断函数,记得要包含头文件)

#if SYSTEM_SUPPORT_OS

  void PendSVHandler(void)
  {
      /*File:os_cpu_a.asm 汇编代码,无法直接转到定义,直接搜索*/
      OS_CPU_PendSVHandler();
  }
  /*!
      \brief      this function handles SysTick exception
      \param[in]  none
      \param[out] none
      \retval     none
  */
  void SysTick_Handler(void)
  {
      /*OS开始跑了,才执行正常的调度处理*/
    if(OSRunning == OS_STATE_OS_RUNNING)
    {
      /*调用uC/OS-III 的 SysTick 中断服务函数 */
      OS_CPU_SysTickHandler();
    }
    //HAL_IncTick();    
  }
#else
  /*!
      \brief      this function handles PendSV exception
      \param[in]  none
      \param[out] none
      \retval     none
  */
  void PendSVHandler(void)
  {

  }
  /*!
      \brief      this function handles SysTick exception
      \param[in]  none
      \param[out] none
      \retval     none
  */
  void SysTick_Handler(void)
  {

  }
#endif

2. µC/OS-III 相关组件配置

此时编译代码会有很多错误
在这里插入图片描述
这是因为µC/OS-III代码中还有很多组件还没有配置,组件配置主要修改配置文件的相关宏参数,重要的宏都在如下四个主要配置文件中:

文件名称路径功能
Os_cfg.huC-OS3/Cfg/Template/os_cfg.h该文件用于配置μCOS-3的内核的一些功能,比如消息队列,信号量,事件标志
Os_cfg_app.huC-OS3/Cfg/Template/os_cfg_app.h该文件用于系统的系统应用配置,如空闲任务,任务统计任务,软件定时器任务的任务参数配置
Cpu-cfg.huC-CPU/Cfg/Template/cpu_cfg.h配置cpu相关的宏定义,如事件戳,前导置零指令,大小端模式相关内容
Lib_cfg.huC-OS3/uC-LIB/Cfg/lib_cfg.h配置μC/lib组件,如内存库中优化的内存相关操作函数,数学函数、ascall码

将cpu_cfg.h中文件中用于配置 CPU 中断优先级寄存器使用位数的宏开关置 1

修改前代码:

#if 0
#define  CPU_CFG_NVIC_PRIO_BITS                            4u
#endif

修改后代码:

#if 1
#define  CPU_CFG_NVIC_PRIO_BITS                            4u
#endif

至此,代码基本雏形就完成了最简单子系统已经完成,编译无错误,下载到开发板中,usart0输出任务运行情况。
如果要使用其他组件,需要打开相关宏即可,关于四个配置文件的配置有很多,为了方便,可以不用依次配置每个宏,直接将我上传的移植完成的Demo中的这几个文件内容直接拷贝过来即可,然后跳过以下关于这几个文件的详细内容。

cpu_cfg.h文件:

配置前配置后备注
#define CPU_CFG_NAME_EN DEF_DISABLED#define CPU_CFG_NAME_EN DEF_ENABLED使能主机名称
#define CPU_CFG_TS_32_EN DEF_DISABLED#define CPU_CFG_TS_32_EN DEF_ENABLED使能32位CPU时间戳功能
#define CPU_CFG_LEAD_ZEROS_ASM_PRESENT#if 0改为#if 1使能前导置零指令
#define CPU_CFG_TRAIL_ZEROS_ASM_PRESENT#if 0改为#if 1使能后导置零指令
#if0 #define CPU_CFG_ENDIAN_TYPE CPU_ENDIAN_TYPE_BIG#if 1 #define CPU_CFG_ENDIAN_TYPE CPU_ENDIAN_TYPE_LITTLE使用小端模式
#define CPU_CFG_NVIC_PRIO_BITS#if 0改为#if 1配置 CPU 中断优先级寄存器使用位数的宏开关

lib_cfg.h文件:

配置前配置后备注
#define LIB_MEM_CFG_HEAP_SIZE 1024u#define LIB_MEM_CFG_HEAP_SIZE 0u堆大小

os_cfg.h文件:

配置前配置后备注
#define OS_CFG_APP_HOOKS_EN 1u#define OS_CFG_APP_HOOKS_EN 0u失能特定应用程序钩子函数
#define OS_CFG_DBG_EN 0u#define OS_CFG_DBG_EN 1u使能调试代码/变量
#define OS_CFG_TS_EN 0u#define OS_CFG_TS_EN 1u使能时间戳功能
#define OS_CFG_PRIO_MAX 64u#define OS_CFG_PRIO_MAX 32u任务优先级数值取值范围0—31
#define OS_CFG_TASK_REG_TBL_SIZE 1u#define OS_CFG_TASK_REG_TBL_SIZE 0u任务特定寄存器的数量为0
#define OS_CFG_TASK_STK_REDZONE_EN 0u#define OS_CFG_TASK_STK_REDZONE_EN 1u禁止越过栈区警戒线

os_cfg_app.h文件:

os_cfg_app.h文件没有什么特别要配置的,只说一下值得注意的几个宏,尤其是这个OS_CFG_TICK_RATE_HZ 作为滴答定时器中断频率使用,决定了系统时基。

备注
#define OS_CFG_IDLE_TASK_STK_SIZE 64u空闲任务堆栈大小
#define OS_CFG_STAT_TASK_PRIO ((OS_PRIO)(OS_CFG_PRIO_MAX-2u))统计任务任务优先级
#define OS_CFG_TICK_RATE_HZ 1000u滴答定时器中断频率
#define OS_CFG_TMR_TASK_PRIO ((OS_PRIO)(OS_CFG_PRIO_MAX-3u))软件定时器的优先级

4.注意事项

void start_task(void *p_arg)函数作为OS开始函数,包含了对系统时钟的配置,其中rcu_clock_freq_get()函是GD32固件库的获取时钟频率的函数(有时会报错,要根据自己使用的库来决定),用在此处是因为滴答定时器的时钟频率和系统时钟频率一样,这里主要目的是获取系统时钟频率,再根据系统时钟频率和滴答定时器中断频率宏来配置滴答定时器。

 CPU_INT32U cntr = 0;
 cntr = rcu_clock_freq_get(CK_SYS) / OS_CFG_TICK_RATE_HZ;
  
 CPU_Init();
 OS_CPU_SysTickInit(cntr);

总结

GD32F103*固件库移植μCOS-Ⅲ详细教程与解析到此就算完成,其他功能的讲解后续将持续更新,欢迎订阅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/60453.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

appium自动爬取数据

爬取类容&#xff1a;推荐知识点中所有的题目 爬取方式&#xff1a;appium模拟操作获取前端数据 入门级简单实现&#xff0c;针对题目和答案是文字内容的没有提取出来 适用场景;数据不多&#xff0c;参数加密&#xff0c;反爬严格等场景 from appium import webdriver impor…

神经概率语言模型

本文主要参考《A Neural Probabilistic Language Model》这是一篇很重要的语言模型论文,发表于2003年。主要贡献如下: 提出了一种基于神经网络的语言模型&#xff0c;是较早将神经网络应用于语言模型领域的工作之一&#xff0c;具有里程碑意义。采用神经网络模型预测下一个单词…

opencv37-形态学操作-开运算(先腐蚀后膨胀)cv2.morphologyEx()-参数 op 设置为“cv2.MORPH_OPEN”

腐蚀操作和膨胀操作是形态学运算的基础&#xff0c;将腐蚀和膨胀操作进行组合&#xff0c;就可以实现开运算、闭运算&#xff08;关运算&#xff09;、形态学梯度&#xff08;MorphologicalGradient&#xff09;运算、礼帽运算&#xff08;顶帽运算&#xff09;、黑帽运算、击中…

uniapp:图片验证码检验问题处理

图形验证码功能实现 uniapp&#xff1a;解决图形验证码问题及利用arraybuffer二进制转base64格式图片&#xff08;后端传的图片数据形式&#xff1a;x00\x10JFIF\x00\x01\x02\x00…&#xff09;_❆VE❆的博客-CSDN博客 UI稿&#xff1a; 需求&#xff1a;向后端请求验证码图片&…

Stable Diffusion AI绘画学习指南【本地环境搭建win+mac】

一、硬件配配置要求 系统&#xff1a;windows 10 / Mac os 硬盘&#xff1a;C 盘预留 15GB 以上&#xff0c;其他盘 50GB 以上,Stable Ddiffusion的很多大模型都是以 GB 起步。 显卡&#xff1a;4GB 以上&#xff0c;建议 8GB, 效率高&#xff0c;能玩大尺寸的图 CPU&…

[MAUI]模仿微信“按住-说话”的交互实现

今天使用这个控件&#xff0c;做一个模仿微信“按住-说话”的小功能&#xff0c;最终效果如下&#xff1a; 使用.NET MAUI实现跨平台支持&#xff0c;本项目可运行于Android、iOS平台。 创建页面布局 新建.NET MAUI项目&#xff0c;命名HoldAndSpeak MainPage.xaml中创建一个…

Flink读取mysql数据库(java)

代码如下: package com.weilanaoli.ruge.vlink.flink;import com.ververica.cdc.connectors.mysql.source.MySqlSource; import com.ververica.cdc.connectors.mysql.table.StartupOptions; import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema; import org…

【数据结构|二叉树遍历】递归与非递归实现前序遍历、中序遍历、后序遍历

递归与非递归实现二叉树的前序遍历、中序遍历、后序遍历。 二叉树图 定义 前序遍历&#xff08;Preorder Traversal&#xff09;&#xff1a; 前序遍历的顺序是先访问根节点&#xff0c;然后按照先左后右的顺序访问子节点。对于上面的二叉树&#xff0c;前序遍历的结果是&…

【React】搭建React项目

最近自己在尝试搭建react项目&#xff0c;其实react项目搭建没有想象中的那么复杂&#xff0c;我们只需要使用一个命令把React架子搭建好&#xff0c;其他的依赖可以根据具体的需求去安装&#xff0c;比如AntDesignMobile的UI框架&#xff0c;执行npm install antd-mobile --sa…

【计算机网络】NAT及Bridge介绍

OSI七层模型 七层模型介绍及举例 为通过网络将人类可读信息通过网络从一台设备传输到另一台设备&#xff0c;必须在发送设备沿 OSI 模型的七层结构向下传输数据&#xff0c;然后在接收端沿七层结构向上传输数据。 数据在 OSI 模型中如何流动 库珀先生想给帕尔梅女士发一封电…

android kernel移植5-RK3568

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.添加开发板默认配置文件前言 前面我们已经学会了移植uboot,其实就是把瑞芯微的关于uboot的一些文件的名字和编译指定的文件改为自己定义的问价和名字,那么接下来的Android kernel其实也是…

探索Streamlit中强大而灵活的 st.write() 函数(五):构建丰富多样的应用界面

文章目录 1 前言2 显示HTML的内容3 显示Markdown内容4 显示代码块5 显示DataFrame的交互式表格6 显示音频和视频7 显示图表8 显示图片9 显示地图10 显示PDF文件11 显示文件下载链接12 结语 1 前言 在这篇博文中&#xff0c;我们将着重介绍Streamlit中一个核心而重要的函数&…

java序列化框架全集讲解

一、简介 Java序列化框架是一种用于在Java应用程序中将对象转换为字节流或从字节流反序列化为对象的工具。序列化是将对象的状态转换为字节流的过程&#xff0c;以便可以将其存储在文件中、通过网络传输或在不同的系统之间共享。反序列化是将字节流转换回对象的过程。 Java序列…

【黑马头条之kafka及异步通知文章上下架】

本笔记内容为黑马头条项目的kafka及异步通知文章上下架部分 目录 一、kafka概述 二、kafka安装配置 三、kafka入门 四、kafka高可用设计 1、集群 2、备份机制(Replication&#xff09; 五、kafka生产者详解 1、发送类型 2、参数详解 六、kafka消费者详解 1、消费者…

Django实现音乐网站 ⑹

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是在添加编辑过程中对后台歌手功能优化及表模型名称修改、模型继承内容。 目录 表模型名称修改 模型继承 创建抽象基类 其他模型继承 更新表结构 歌手新增、编辑优化 表字段名称修改 隐藏单曲数和专辑数 姓…

复制带随机指针的链表【构造链表深拷贝】

复制带随机指针的链表 文章目录 复制带随机指针的链表 链表复制要求 解题思路 1、拷贝所有节点&#xff0c;并放在对应原节点的后面 2.将每个 random 指向对应的位置。 3.将复制的链表解下来&#xff0c;尾插到一起&#xff0c;并将原链表恢复 源码 先导知识点&#…

C语言手撕单链表

一、链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;也就是内存存储不是像顺序表那么连续存储&#xff0c;而是以结点的形式一块一块存储在堆上的&#xff08;用动态内存开辟&#xff09;。 既然在内存上不是连续存储&#xff0c;那我们如何将这一…

第28天-Kubernetes架构,集群部署,Ingress,项目部署,Dashboard

1.K8S集群部署 1.1.k8s快速入门 1.1.1.简介 Kubernetes简称k8s&#xff0c;是用于自动部署&#xff0c;扩展和管理容器化应用程序的开源系统。 中文官网&#xff1a;https://kubernetes.io/zh/中文社区&#xff1a;https://www.kubernetes.org.cn/官方文档&#xff1a;https…

保护模式中段选择子权限校验逻辑详解

保护模式中段选择子权限校验逻辑详解 CPLRPLDPL权限校验逻辑测试 CPL CPL是当前进程的权限级别(Current Privilege Level)&#xff0c;是当前正在执行的代码所在的段的特权级&#xff0c;存在于cs段选择子的后两位的低两位。 段选择子可见部分的数据结构如下&#xff1a; 举例…

基于SpringBoot+Vue的漫画网站设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…