首页 > 其他分享 >给STM32装点中国风——华为LiteOS移植

给STM32装点中国风——华为LiteOS移植

时间:2023-11-05 16:12:06浏览次数:37  
标签:CODE LiteOS STM32 源码 装点 USER Config 目录

  我都二手程序员好几个礼拜了!想给我的STM32来点“中国风”,装个华为LiteOS操作系统。

 
  在此之前,我也试过STM32CubeMX自带的FreeRTOS操作系统,不知是何缘故,用F103c8t6芯片时,FreeRTOS里的一个断言过不去。出师不利,决定换LiteOS试试,尽管移植LiteOS有些麻烦,不如STM32CubeMX生成的方便,但是,移植成功后,编译没有问题、运行也没有问题,这让我这个初学者增添了不少信心。

 
  FreeRTOS与LiteOS孰优孰劣,我真的不知道,不过,我知道我喜欢CubeMX,Keil也算凑活,所以,想用大白话说说,如何给STM32CubeMX创建的MDK-ARM工程移植LiteOS。如果,你也想用华为LiteOS操作系统,可以继续往下看,若是内行高手,“要是你拿正眼多看我一眼,那你就输了”。

 

一、 准备一个STM32CubeMX工程

  没什么特殊要求,注意以下两点:一、SYS 时钟源不要用SysTick。二、项目管理中Toolchain选择MDK-ARM。

 

二、 LiteOS源码去那里找

  上面给的链接不是最新发行版,新版本增加了些芯片架构的支持,暂时还不会用。先来个打了标签LiteOSV200R001C50B038的版本。下图中红框标注的4个目录是我们需要的。

 

三、 把LiteOS源码拷贝到咱的Keil工程目录下

  LiteOS源码下载好了吧?我们开始给Keil工程添加LiteOS源码。

  1. 先在Keil工程根目录下,建一个目录LiteOS,用来放置LiteOS的源码,(其实目录名叫什么不重要,看你高兴)。

  2. 在新建的LiteOS目录下,再整4个子目录,分别叫它们KernelArchCMSISConfig。看看它们的名字,想必您已经猜到了,我想在里面放些什么了,对喽,就是图1中那4个目录所对应的内容。

  3. 怎么复制源码呢?是不是这个姿势...

  不必这样,按照下面的图片复制就好。

  • 首先,Kernel目录

      把LiteOS源码中kernel目录下的内容全部复制到工程里的 .\LiteOS\Kernel目录下,然后再把.\LiteOS\Kernel\base\mem目录下的两个子目录bestfittlsf删除。

  • 接下来是Arch目录

  从LiteOS源码arch\arm\arm-m中复制两个目录srcinclude到工程.\LiteOS\Arch目录下。

  然后,根据你的STM32芯片的具体架构(cortex-m3或cortex-m4 ??),选择复制arch\arm\arm-m\contex-m?\keil\los_dispatch_keil.S到工程.\LiteOS\Arch目录下。下图,我的芯片是Cortex-m3的。

  复制好以后,Arch目录长这样。

  • 现在是,CMSIS目录

  这个目录下是与操作系统供应商无关的抽象层,复制LiteOS源码osdepends\liteos\cmsis目录中的文件到工程目录.\LiteOS\CMSIS目录下。

  • 最后,复制Config目录

​  这个目录下应放置和你芯片相匹配的配置文件,咱们先去LiteOS源码的targets目录下找一个合适的,然后把它里面OS_Config目录下的头文件(.h 文件),复制到工程的.\LiteOS\Config目录下。

  复制好以后,我的Config目录是这个样子的。

 

四、 在Keil工程中添加分组(Groups)

在Keil的IDE环境中,分别添加以下4个分组:

  • LiteOS/Kernel
  • LiteOS/Arch
  • LiteOS/CMSIS
  • LiteOS/Config

在LiteOS/Kernel分组下,我们添加上面复制在..\LiteOS\Kernel目录下(包含子目录下)的所有.c的源文件。

在LiteOS/Arch分组下,添加..\LiteOS\Arch目录下(包含子目录下)所有.c的源文件,还不够,还有那个名为los_dispatch_keil.S的汇编源文件也得添加。

在LiteOS/CMSIS分组下,添加..\LiteOS\CMSIS目录下的cmsis_liteos.c

在LiteOS/Config分组下,添加..LiteOS\Config目录下的所有.h的头文件,其实,这个分组不建,程序照样能跑,但是,为了以后修改参数方便,我们还是先安排上吧。

 

五、 给Keil工程添加头文件引用路径

  添加内容如下:

../LiteOS/Arch/include

../LiteOS/Kernel/include

../LiteOS/Kernel/base/include

../LiteOS/Kernel/extended/include

../LiteOS/Config

../LiteOS/CMSIS

 

六、 注释掉STM32生成的两个中断处理函数(PendSV_Handler、SysTick_Handler)

  它们俩藏在一个叫stm32f?xx_it.c的文件中, 注释掉就好。

 

七、 修改配置

  记得前面创建的Keil工程分组LiteOS/Config分组吗?配置参数就藏在这儿。

  分组中有个叫target_config.c文件,你可以根据使用的芯片,在这修改一下#define BOARD_SRAM_SIZE_KB 40参数,据说,该值应该比芯片实际的SRAM略小。

  其它的参数,在实际开发过程中,慢慢研究调整吧。我读书少,更多的内容也搞不清楚。

  到这里,LiteOS的移植工作算是差不多了,接下来,点一盏灯,验证一下"来时的路"。

 

八、 一灯大师,发功了

  1. 在main.c 引入头文件

    #include "cmsis_os.h"

  2. 在main.c 申明俩个变量

    /* Private variables ---------------------------------------------------------*/
    
    /* USER CODE BEGIN PV */
    osThreadId_t default_taskHandle;
    const osThreadAttr_t default_task_attributes = {
    	.name = "default_task",
    	.stack_size = 512 * 4,
    	.priority = (osPriority_t) osPriorityNormal,
    };
    /* USER CODE END PV */
    
  3. 在main.c 申明两个函数

    /* USER CODE BEGIN PFP */
    /* LITEOS BEGIN PFP */
    void StartDefaultTask(void *argument);
    void LiteOS_Init(void);
    /* LITEOS END PFP */
    /* USER CODE END PFP */
    
    
  4. 在main.c中,实现上面的函数

    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    void LiteOS_Init(void)
    {
        osKernelInitialize();	
        default_taskHandle = osThreadNew(StartDefaultTask, NULL, &default_task_attributes);	
    }
    
    void StartDefaultTask(void *argument)
    {
        while(1)
        {		
     	   /*  一灯大师,请试试在这里点一盏灯。  */
     	   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
     	   osDelay(200);
        }
    }
    /* USER CODE END 0 */
    
  5. 在main.c中, int main(void)函数体里调用

       /* USER CODE BEGIN 2 */
    	   LiteOS_Init();	
    	   osKernelStart(); //注意,这东西要在main的while之前
    	
         /* USER CODE END 2 */
         /* Infinite loop */
         /* USER CODE BEGIN WHILE */
         while (1)
         {
           /* USER CODE END WHILE */
       
           /* USER CODE BEGIN 3 */
         }
         /* USER CODE END 3 */
    

    灯亮了吗?祝您成功!

 

九、 手搓 LiteOS移植工具

  写到这儿,不知道我讲清除了没有。还不行的话,我准备了一个手搓移植工具,要不您也试试。

  我把它放这儿了,Python实现,有源码,改改给Makefile工程移植应该也行。它长下面这副德行:

  • LiteOS移植完成后,如果再次点击STM32CubeMX中的GENERATE CODE按钮,会把工具注释掉的两个中断处理函数恢复出来,这时需要您手工注释掉它们。PendSV_HandlerSysTick_Handler 他们在..\Core\Src\stm32f?xx_it.c文件中。或者,也可以再次点击工具中的开始移植按钮,也能注释掉它们。

  • 根据实际情况设置LiteOS的BOARD_SRAM_SIZE_KB参数, 这个值应略小于芯片的SRAM,LiteOS配置文件位于LiteOS\Config分组下的target_config.h文件中,约在283行处 #define BOARD_SRAM_SIZE_KB 40。 本工具定义了一些芯片的SRAM设置尺寸,由于个人能力问题,它们既不全面,也不准确。(工具中关于芯片配置定义,见stm32.py中的枚举类class STM32

标签:CODE,LiteOS,STM32,源码,装点,USER,Config,目录
From: https://www.cnblogs.com/shenwx/p/17810550.html

相关文章

  • (STM32)TIM
    TIM:定时器,定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断根据复杂度和应用场景分为:高级定时器、通用定时器、基本定时器三种类型 基本定时器:支持向上计数(0到1),只能选择内部的72MZ的时钟通用定时器、高级定时器:支持向上计数、向下面计数(1到0)、中央计数(0......
  • STM32 PWM控制LED流水灯 学习记录随笔
    代码部分#include"stm32f10x.h"                 //Deviceheader#include"Delay.h"intmain(void){   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//启用系统寄存器时钟,使能GPIOC组,并启动   GPIO_InitTypeDefGPIO_InitStructure;  ......
  • STM32驱动SIM900A保姆级调试日记
    外观在优信电子买的,比其它商铺价格略高,不过质量应该有保障引脚连接VCC_IN接5VGND接地RXD接MCU TXDTXD接MCURXD(mcu指的是单片机如STM32)因为我只是用来发短信,所以其它引脚不用接!如果需要打电话可能需要咪头和喇叭!但如果是仅仅需要电话做一个提醒的作用,也可以只接上述几个引脚!串......
  • stm32学习记录随笔23.11.3
    RCC外设时钟使能常用函数//标准库文件->stm32f10x_rcc.hvoidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalStateNewState);//RCC_AHB外设时钟控制voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);//RCC_APB2外设时钟控制void......
  • 舵机驱动——STM32F407ZGT6探索者——HAL库
    舵机驱动——STM32F407ZGT6探索者——HAL库1、材料准备开发板:正点原子STM32F407ZGT6探索者舵机:SG90舵机线材分辨:褐色/红色/橘黄色——GND/VCC/PWM_signal与开发板接线:褐色/红色/橘黄色——GND/+5V/PF6(任选的PF6)2、知识准备2.1、舵......
  • (STM32)中断系统和外部中断
    中断系统:是执行和管理中断的逻辑结构外部中断:是众多能产生中断的外设之一中断:指的是中断源(中断通道),中断产生CPU暂停正在执行程序,去执行中断程序,然后返回。提高效率F1系列的STM32有68个中断源,不同系列需要看手册EXTI(外部中断)、TIM、ADC、USART、SPI、I2C、RTC等多个外设都会......
  • stm32开发
    基于寄存器开发新建工程添加C/C++识别路径;  防止中文乱码- 改变编码格式   基于库函数开发......
  • 关于STM32芯片类型的详解
    关于STM32芯片类型的详解对于STM32芯片类型英文缩写的详解及相关型号: CL - Connect Line(互联型):包含STM32F105和STM32F107两个系列,该系列的芯片侧重于提供丰富的外设和连接选项,以满足各种连接性要求的应用场景。VL - Value Line(超值型):包含stm32f100系列,该系列的芯片是为......
  • 基于LiteOS的智慧农业案例实验分享
    最近在指导一位读者朋友做毕业设计,该毕设是关于端云互通的,基于小熊派+LiteOS+华为云。在指导他的过程中我也学到了不少东西,这里通过一个案例实验(智慧农业)给大家分享一些知识。实验框图相关模块简介1、STM32L431RCT62、LiteOSLiteOS是华为开发的轻量级实时操作系统:LiteOS源码GitHub......
  • 关于STM32时钟的问题记录
    关于STM32时钟的问题    在读别人建立大型的STM32工程时,会看到主函数中会首先执行一个RCC_Init()的函数,跳转过去之后发现是配置时钟的相关函数。而我自己在写STM32相关代码的时候,似乎从来没有注意过这个问题,我猜想在STM32程序开始执行的时候,也就是复位之后,会首先执行时钟......