• HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验


    HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验

    硬件平台

    基于正点原子战舰V3开发板
    MCU:STM32F103ZET6
    片上SRAM大小:64KBytes
    片上FLASH大小:512KBytes

    移植准备

    IDE软件:Keil MDK5
    串口调试助手

    源码下载

    HarmonyOS源码开源在gitee上
    LiteOS_m的源码仓库

    源码结构

    根文件夹下的arch_spec.md文件内容即源码结构树,但该结构树不是最新,可以看到当前targers文件夹下已经添加了对STM32F1单片机的例程,但该结构树中并未列出

    .
    ├── components                                                  --- 可选组件,可裁剪,依赖kernel
    │   ├── cppsupport                                              --- C++支持
    │   └── cpup                                                    --- CPUP功能
    ├── kal                                                         --- 内核抽象层
    │   ├── cmsis                                                   --- cmsis标准支持
    │   └── posix                                                   --- posix标准支持
    ├── kernel                                                      --- 内核最小功能集支持
    │   ├── arch                                                    --- 硬件架构相关
    │   │   ├── arm                                                 --- arm32架构
    │   │   │   └── cortex-m4                                       --- cortex-m4架构
    │   │   │       └── iar                                         ---
    │   │   │           ├── los_atomic.h
    │   │   │           ├── los_context.h
    │   │   │           ├── los_interrupt.h
    │   │   │           └── los_mpu.h
    │   │   └── include
    │   │       ├── los_arch_atomic.h                               --- 定义通用arch的原子操作
    │   │       ├── los_arch_context.h                              --- 定义通用arch的上下文切换
    │   │       ├── los_arch.h                                      --- 定义通用arch初始化
    │   │       └── los_arch_interrupt.h                            --- 定义通用arch中断
    │   ├── include
    │   │   ├── los_config.h                                        --- 功能开关和配置参数
    │   │   ├── los_event.h                                         --- 事件
    │   │   ├── los_liteos.h                                        --- liteos最小功能集对外提供的头文件
    │   │   ├── los_memory.h                                        --- 堆内存管理
    │   │   ├── los_mutex.h                                         --- 互斥锁
    │   │   ├── los_queue.h                                         --- 队列
    │   │   ├── los_scheduler.h                                     --- 调度算法
    │   │   ├── los_sem.h                                           --- 信号量
    │   │   ├── los_task.h                                          --- 任务
    │   │   └── los_timer.h                                         --- 定时器
    │   └── src
    ├── targets
    │   └── targets
    │       └── cortex-m4_stm32f429ig_fire-challenger_iar
    │           ├── board
    │           ├── dprintf.c
    │           ├── Libraries
    │           ├── main.c
    │           ├── project
    │           ├── target_config.h                                 --- 板级配置功能开关和配置参数
    │           └── Utilities
    └── utils
        ├── include
        │   ├── los_compiler.h                                      --- 编译工具配置,类型定义
        │   ├── los_debug.h                                         --- debug,printf相关
        │   ├── los_error.h                                         --- 错误定义
        │   └── los_list.h
        └── src
    

    启动流程

    在 argetscortex-m3_stm32f103_simulator_keilproject文件夹下打开工程文件(los_demo.uvproj)
    工程下有三个文件夹:liteos-m、main、component
    程序加载时,首先进入liteos-m下的los_startup.s文件,内容如下

                PRESERVE8
    
        AREA    RESET, CODE, READONLY
        THUMB
    
        IMPORT  ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit||
        IMPORT  HalHwiDefaultHandler
    
        EXPORT  _BootVectors
        EXPORT  Reset_Handler
    
    _BootVectors
        DCD     ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit||
        DCD     Reset_Handler
        DCD     HalHwiDefaultHandler
        DCD     HalHwiDefaultHandler
    
    
    Reset_Handler
        CPSID   I
    
        IMPORT  LOS_HardBootInit
        BL      LOS_HardBootInit
        IMPORT  __main
        LDR     R0, =__main
        BX      R0
    
        ALIGN
        END
    

    可以看出,启动文件只定义了启动向量和reset向量,其他的向量在los_interrupt.c中动态加载

    通过LOS_HardBootInit跳转到系统硬件初始化代码,对Uart进行初始化(该例程只用到了串口)

    void LOS_HardBootInit()
    {
        UINT32 uwRet = LOS_OK;
    
        uwRet = LOS_UartBaseInit();
        if (uwRet != LOS_OK)
        {
            return ;
        }
    
        return ;
    }
    

    初始化后回到启动文件并跳转到main函数:

    LITE_OS_SEC_TEXT_INIT int main(void)
    {
        unsigned int ret;
    
        //USART_Config();
    
        printf("
    
    hello world!!
    
    ");
    
        ret = LOS_KernelInit();
        taskSample();
    		
        if (ret == LOS_OK) {
            LOS_Start();
        }
    
        while (1) {
            __asm volatile("wfi");
        }
    }
    

    main函数开始进行了hello world打印,并进行了内核的初始化,最后进行进程测试,创建并运行两个进程

    移植需要的修改

    工程中使用自定义.sct文件对各个区进行分散加载,详细加载文件见 argetscortex-m3_stm32f103_simulator_keilprojectlos_demo.sct(注意路径,不是output文件夹下的.sct文件,keil在编译过程中也会产生一个.sct文件),详细内容如下:

    LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
      ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
       	los_startup.o (RESET, +First)
       *(InRoot$$Sections)
       * (+RO)
      }
      RW_IRAM1 0x20000000 0x00200000  {  ; RW data
          * (.data, .bss, .data.init)
      }
        VECTOR 0x20200000 0x400         ; Vector
      {
    	* (.vector)
      }
      
      ARM_LIB_STACKHEAP 0x08100000 EMPTY 0x1000 
      {
    	
      }	
    }
    

    由于片内SRAM和FLASH大小等因素,各段映射地址需要进行相应调整,我修改的映射地址如下(个人习惯):

    LR_IROM1 0x08000000 0x00080000  {    ; 加载域FLASH起始地址0x08000000 大小0x00080000(512KBytes)
      ER_IROM1 0x08000000 0x00080000  {  ; 从FLASH中加载程序,所以将程序启动文件定向到FLASH首地址,其它只读字段也定位到这里
       	los_startup.o (RESET, +First)
       *(InRoot$$Sections)
       * (+RO)
      }
      RW_IRAM1 0x20000000 0x00010000  {  ; SRAM起始地址0x20000000 大小0x00010000(64KBytes),其它读写段和未初始化变量均定位到SRAM中
          * (.data, .bss, .data.init)
      }
        VECTOR 0x2000E000 0x1000         ; 向量表地址
      {
    	* (.vector)
      }
      
      ARM_LIB_STACKHEAP 0x20010000 EMPTY -0x1000 ;堆栈空间,存放在内存的高地址向下的一段空间,大小0x1000(4KBytes)
      {
    	
      }	
    }
    

    由于SRAM内存限制,需要修改OS内存池大小

    修改位置为 argetscortex-m3_stm32f103_simulator_keil arget_config.h文件中的OS_SYS_MEM_SIZE宏定义,将内存池大小减小,我将其修改为了0x00000D000(52KBytes)

    编译运行

    将输出文件下载进MCU,连接串口波特率设置115200即可输出helloworld信息和进程运行信息

    原创内容,转载请注明来源

  • 相关阅读:
    DRF
    DRF
    DRF
    DRF
    RESTful介绍
    DRF parser请求处理流程
    Vue项目的创建
    怎么清除file控件的文件路径
    java用spring实现文件下载
    JS判断元素是否在数组内 阿星小栈
  • 原文地址:https://www.cnblogs.com/zhaipanger/p/14247552.html
Copyright © 2020-2023  润新知