一、单片机移植 LiteOS

摘要:本文基于AT32F437ZMT7,详细讲述华为LiteOS的移植过程。LiteOS官方已经适配过cortexM系列内核的单片机,因此移植过程非常简单。LiteOS有两种移植方案:OS接管中断和非接管中断方式。接管中断的方式,是由LiteOS创建很管理中断,需要修改单片机启动文件,移植比较复杂。一般单片机厂商的中断管理做的很好以及比较成熟稳定,用不着由LiteOS管理中断,所以我们下边的移植方案,都是非接管中断的方式的。中断的使用,跟在裸机工程时是一样的。

1.下载LiteOS源码

(1) LiteOS源码下载-注使用develop分支,主分支无OS_CONFIG文件夹未找到MDK移植配置说明及移植参考暂不研究
(2) LiteOS使用指南
(3) LiteOS目录结构
(4) 移植教程参考
(5)文章参考引用来源:【LiteOS】STM32F103-LiteOS移植教程(详细篇)

2.拷贝内核源码

在工程目录下新建LiteOS文件夹(文件夹名称个人自定义),从上一步下载的LiteOS内核源码中,将arch、kernel、LiteOS-develop\targets\Cloud_STM32F429IGTx_FIRE\OS_CONFIG 拷贝至LiteOS文件夹内,
(1)新建工程文件夹LiteOS ,放置LiteOS移植源码
(2)复制源码arch、kernel、OS_CONFIG 文件夹到新建的工程文件夹LiteOS下(注: LiteOS源码核心文件夹的说明链接 )

在这里插入图片描述
arch 中是CPU架构相关的代码;
kernel是LiteOS内核代码;
OS_CONFIG中是配置内核功能的头文件,可用于裁剪内核功能,我们从官方提供的例程中拷贝过来(可从target文件夹给出的例子中任意拷贝一个)。

3.向MDK工程添加内核文件

打开MDK工程(准备一份基础工程),打开Mange Project Items。
(1)添加arch分组
在Groups添加 LiteOS/arch分组,添加以下文件:

arch\arm\arm-m\src 目录下的全部文件
    los_hw.c
    los_hw_tick.c
    los_hwi.c
 arch\arm\arm-m\cortex-m4\keil 目录下的:(注:根据芯片内核选cortex-m文件夹)
 	los_dispatch_keil.S(注:点击AddFiles时,MDK默认添加.c类型的文件。los_dispatch_keil.S是汇编文件,因此在添加时,需要将文件类型选择为All files。)

结果如图所示:
在这里插入图片描述(2)添加kernel分组
在Groups添加 LiteOS/kernel分组,添加以下文件:

kernel\base\core 文件夹下全部.c文件
	los_priqueue.c
	los_swtmr.c
	los_sys.c
	los_task.c
	los_tick.c
	los_timeslice.c
kernel\base\ipc  文件夹下全部.c文件
	los_event.c
	los_mux.c
	los_queue.c
	los_sem.c
kernel\base\mem\bestfit_little 文件夹下全部.c文件
	los_heap.c
	los_memory.c
kernel\base\mem\common 文件夹下全部.c文件
	los_memcheck.c
	los_memstat.c
	los_slab.c
	los_slabmem.c
kernel\base\mem\membox 文件夹下全部.c文件
	los_membox.c
kernel\base\misc 文件夹下全部.c文件
	los_misc.c
kernel\base\om 文件夹下全部.c文件
	los_err.c
kernel\extended\tickless 文件夹下全部.c文件
	los_tickless.c
kernel 文件夹下的 
	los_init.c

结果如图所示:
在这里插入图片描述
在这里插入图片描述说明:liteos提供三套动态内存算法,位于kernel/base/mem目录下,分别为bestfit、bestfit_little、tlsf,我们本次移植的是bestfit_little.可根据需求移植其他的算法。kernel\base\mem\membox目录下是 LiteOS 提供的静态内存算法,与动态内存算法不冲突。
(4)添加config分组
在Groups添加 LiteOS/config分组,添加以下文件:方便os配置参数修改

OS_CONFIG 文件夹下全部.h文件
	los_builddef.h
	los_printf.h
	target_config.h

结果如图所示:
在这里插入图片描述

(5)配置头文件
需要添加的头文件路径为:

arch\arm\arm-m\include
kernel\include
kernel\base\include
kernel\extended\include
OS_CONFIG

结果如图所示:
在这里插入图片描述(6)移除Systick和pendsv中断
打开at32f435_437_int.c,找到 SysTick_Handler 和 PendSV_Handler
将这两个中断处理函数屏蔽掉。
在这里插入图片描述

说明:liteos内核使用到了systick和pendsv这两个中断,并在内核代码中有对应实现
(7)修改target_config.h
OS_CONFIG/target_config.h 文件,该文件主要用于配置MCU驱动头文件、RAM大小、内核功能等,需要根据自己的环境进行修改。

我们主要需要修改以下两处:

  • MCU驱动头文件
    在这里插入图片描述根据使用的MCU,包含对应的头文件。

  • 系统时钟设置
    在这里插入图片描述
    根据使用的MCU芯片配置系统时钟频率大小进行修改。这里添加自定义变量方便更改时钟节拍配置,单前使用配置是25MHz

  • SRAM大小,源码修改如下

/*=============================================================================
                                       Memory module configuration
											  ÄÚ´æÄ£¿éÅäÖÃ
=============================================================================*/
#define BOARD_SRAM_START_ADDR     0x20000000 //ÄÚ´æÆðʼµØÖ·
#define BOARD_SRAM_SIZE_KB        60         //¿É¹ÜÀíÄÚ´æµÄ´óС AT32F437ZMT7 512KSRAM
#define BOARD_SRAM_END_ADDR  (BOARD_SRAM_START_ADDR + 1024 * BOARD_SRAM_SIZE_KB)// ÄÚ´æ½áÊøµØÖ·

/**
* Config the start address and size of the LiteOS's heap memory
*/
#if defined ( __CC_ARM )

extern UINT32 Image$$RW_IRAM1$$ZI$$Limit;
#define LOS_HEAP_MEM_BEGIN    (&(Image$$RW_IRAM1$$ZI$$Limit))
#define LOS_HEAP_MEM_END      BOARD_SRAM_END_ADDR

#elif defined ( __ICCARM__ )

#pragma segment="HEAP"
#define LOS_HEAP_MEM_BEGIN    (__segment_end("HEAP"))
#define LOS_HEAP_MEM_END      BOARD_SRAM_END_ADDR

#elif defined ( __GNUC__ )

extern UINT32 _ebss;
extern UINT32 _Min_Stack_Size;
extern UINT32 _Min_Heap_Size;
#define LOS_HEAP_MEM_BEGIN ((UINT32)(&_ebss) + (UINT32)(&_Min_Heap_Size))
#define LOS_HEAP_MEM_END ((UINT32)BOARD_SRAM_END_ADDR - (UINT32)(&_Min_Stack_Size))

#else
#error "Unknown compiler"
#endif

extern UINT8 *m_aucSysMem0;
//extern UINT32 __LOS_HEAP_ADDR_START__;
//extern UINT32 __LOS_HEAP_ADDR_END__;

/**
 * @ingroup los_config
 * Starting address of the memory
 * ϵͳµÄÄÚ´æÆðʼµØÖ·
 */
#define OS_SYS_MEM_ADDR                                     (VOID *)LOS_HEAP_MEM_BEGIN//(VOID *)__LOS_HEAP_ADDR_START__

/**
 * @ingroup los_config
 * Ending address of the memory
 */
extern UINT32 g_sys_mem_addr_end;

/**
 * @ingroup los_config
 * Memory size
 * ϵͳµÄÄÚ´æ´óС£¬´óСΪ½áÊøµØÖ·-ÆðʼµØÖ·+1
 */
#define OS_SYS_MEM_SIZE                                     (UINT32)((UINT32)LOS_HEAP_MEM_END - (UINT32) LOS_HEAP_MEM_BEGIN) //((UINT32)(__LOS_HEAP_ADDR_END__ - __LOS_HEAP_ADDR_START__ + 1))

/**
 * @ingroup los_config
 * Configuration module tailoring of mem node integrity checking
 * ÅäÖÃÄÚ´æ½ÚµãÍêÕûÐÔ¼ì²â£¬Ä¬ÈÏ´ò¿ª
 */
#define LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK                YES

/**
 * @ingroup los_config
 * Configuration module tailoring of mem node size checking
 * ÅäÖÃÄÚ´æ½Úµã´óС¼ì²é£¬Ä¬ÈÏ´ò¿ª
 */
#define LOSCFG_BASE_MEM_NODE_SIZE_CHECK                     YES

/*
 * ÅäÖÃÄÚ´æËã·¨ ÐèÌí¼ÓbestfitÄÚ´æ¹ÜÀíËã·¨µ½¹¤³Ì£¬±¾¹¤³ÌʹÓÃbestfit_littleËã·¨
*/
#define LOSCFG_MEMORY_BESTFIT                               YES

/**
 * @ingroup los_config
 * Configuration module tailoring of more mempry pool checking
 */
#define LOSCFG_MEM_MUL_POOL                                 YES

/**
 * @ingroup los_config
 * Number of memory checking blocks
 */
#define OS_SYS_MEM_NUM                                      20

/**
 * @ingroup los_config
 * Configuration module tailoring of slab memory
 */
#define LOSCFG_KERNEL_MEM_SLAB                              YES

在这里插入图片描述

根据使用的MCU芯片SRAM大小进行修改。

这里我们使用的是AT32F437ZMT7,其SRAM为512KB,自定义RTOS可用内存为60KB。

  • 不接管中断
    在这里插入图片描述设置LOSCFG_PLATFORM_HWI 宏定义为 NO(该值默认为NO,一般无需修改,出于谨慎,移植过来还是要检查下)

target_config.h 文件还有很多其他宏定义,主要是配置内核的功能。比如是否使用队列、软件定时器、是否使用时间片、信号量等。
(8)针对AT32F437ZMT7报错修改
在这里插入图片描述屏蔽宏定义 FLASE和TRUE;
(9)补充一

  • 拷贝LiteOS源码 osdepends\liteos路径下的cmsis文件夹到工程文件夹LiteOS目录下,结果如下所示:
    在这里插入图片描述
  • 复制include文件夹到cmsis文件夹目录下。
    Include文件夹是Keil_v5安装目录下的一个文件夹,里面包含了ARM的相关文件,其路径为 C:\Keil_v5\ARM\Pack\ARM\CMSIS\4.5.0\CMSIS\Include,如图 Keil_v5安装目录下的Include文件夹内容所示。
    在这里插入图片描述
    最终cmsis文件夹内容如图所示:
    在这里插入图片描述
  • 在keil5工程项目中新建LiteOS/cmsis文件夹,添加cmsis文件夹下cmsis_liteos.c文件。
    结果如图所示:
    在这里插入图片描述
  • 添加头文件路径到工程中
cmsis
cmsis\1.0
cmsis\2.0
cmsis\include

结果如图所示:
在这里插入图片描述
(9)补充二
工程c/c++配置设置,选中C99 Mode。最终结果如图所示
在这里插入图片描述
经过以上的操作,LiteOS的移植就完成了。点击编译。注工程中,不要留存原有的RTOS接口,容易导致报错。先移植主体,再缓慢修改接口。
移植完成工程参考(工程代码基于雅特力官方AT-START-F437 V1.0开发板,可以直接烧录验证):百度云盘 提取码:2oih

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值