User Tools

Site Tools


Sidebar

Go Back

Refresh

You are not allowed to add pages

Direct Link

library:nordic:liteos_keil

Building LiteOS With Keil

1. 摘要

Porting LiteOS to NRF52832, using Keil to build.

本文使用LiteOS的版本为 V200R001C50B037_20181226,获取方式如下:

git clone https://gitee.com/LiteOS/LiteOS.git
git checkout tag_LiteOS_V200R001C50B037_20181226

2. 准备一个裸机工程

使用SDK中的例子工程,nRF5_SDK_17.0.2_d674dde\examples\peripheral\blinky :

  • 复制工程配置文件 blinky_pca10040.uvprojx (位于目录nRF5_SDK_17.0.2_d674dde\examples\peripheral\blinky\pca10040\blank\arm5_no_packs)
  • 复制代码文件 main.c (位于目录E:\nrfProjects\nRF5_SDK_17.0.2_d674dde\examples\peripheral\blinky)
  • 复制SDK配置文件 sdk_config.h (位于目录E:\nRF5_SDK_17.0.2_d674dde\examples\peripheral\blinky\pca10040\blank\config)
  • 链接(或复制)SDK到工程更目录(mklink /D nRF5_SDK_17.0.2_d674dde ..\nRF5_SDK_17.0.2_d674dde)
  • 在Keil中打开工程(可能会缺少工具包,跳过,在软件内设置或安装工具包)

工程经过拷贝后,路径发生已改变,需要重新设置:

  • 代码文件路径(直接在工程配置文件.uvprojx中批量修改)
  • 修改编译参数中的头文件搜索路径(否侧缺失头文件报错)
  • 修改调试器(根据实际使用的调试器设置,例如:J-LINK,SW模式)
  • 编译、加载运行
  • 4个LED交替点亮/熄灭

裸机工程准备完毕。

3. *准备打印输出端口

使用 RTT 作为打印输出端口 :

  • 链接(或复制)RTT代码包到当前工程(mklink /D RTT ..\SEGGER_RTT_V765b)
  • 添加代码文件 SEGGER_RTT.c, SEGGER_RTT_printf (路径: RTT\RTT)
  • 添加头文件搜索目录 ( RTT\RTT, RTT\Config)
  • 测试打印端口,添加打印代码
#include "SEGGER_RTT.h"
...
...
SEGGER_RTT_WriteString(0, "SEGGER Real-Time-Terminal For LiteOS Builder\r\n\r\n");
模块 根路径 目录 文件 说明
arch arch\arm\arm-m cortex-m4\keil los_dispatch_keil.S
include los_exc.h los_hw.h los_hw_tick.h los_hwi.h
src los_hw.c
los_hw_tick.c
los_hwi.c
kernel kernel los_init.c
kernel base\core *
base\ipc *
base\mem\bestfit_little *
base\mem\membox *
base\misc *
base\om *
extended\tickless *
config targets\Cloud_STM32F429IGTx_FIRE\OS_CONFIG target_config.h 1. 复制所有文件用以建立新的硬件版本(例如targets\NRF52)
2. 修改target_config.h中芯片定义文件引用:#include “stm32f4xx.h” –> #include “nrf52.h”
3. 不接管中断,修改target_config.h, #define LOSCFG_PLATFORM_HWI NO
los_printf.h
los_builddef.h

4. 代码修改

文件 修改内容 说明
target_config.h #define LOSCFG_PLATFORM_HWI YES 改为 #define LOSCFG_PLATFORM_HWI NO, LiteOS不接管中断
#include “stm32f4xx.h” 改为#include “nrf52.h”,使用NRF的器件定义
los_printf.h添加
#include “SEGGER_RTT.h”
#define printf(fmt,args…) SEGGER_RTT_printf(0,fmt, ##args)
通过RTT实现LiteOS打印输出

修改 main.c,测试建立任务和调度任务。

main.c
#include <stdbool.h>
#include <stdint.h>
#include "nrf_delay.h"
#include "SEGGER_RTT.h"
#include "boards.h"
 
#include "los_sys.h"
#include "los_task.h"
 
#define __HEAP_SIZE__		(16384)
uint8_t _heap[__HEAP_SIZE__];
uint32_t __LOS_HEAP_ADDR_START__;
uint32_t __LOS_HEAP_ADDR_END__;
 
void* led_task(UINT32 arg)
{
	for(;;)
	{
		if( arg < 4 ) bsp_board_led_invert(arg);
		LOS_TaskDelay(1000);
	}
}
 
UINT32 led1_task_handle;
UINT32 led2_task_handle;
 
int main(void)
{
	TSK_INIT_PARAM_S task_param;
	TSK_INIT_PARAM_S task_param2;	
 
	__LOS_HEAP_ADDR_START__ = (UINT32)_heap;
	__LOS_HEAP_ADDR_END__ = __LOS_HEAP_ADDR_START__ + __HEAP_SIZE__ -1;	
 
	SEGGER_RTT_WriteString(0, "SEGGER Real-Time-Terminal For LiteOS Builder\r\n\r\n");
 
	/* Configure board. */
	bsp_board_init(BSP_INIT_LEDS);
 
	uint32_t retcd;
	retcd = LOS_KernelInit();
	if( retcd == LOS_OK ) {
		PRINT_EMG("Initialize LiteOS Kernel successful!\r\n");
	}
	else {
		PRINT_ERR("Initialize LiteOS Kernel failed!\r\n");
	}
 
	task_param.pcName = "led1_task";
	task_param.pfnTaskEntry = led_task;
	task_param.uwStackSize = 512;
	task_param.usTaskPrio = 4;
	task_param.uwArg = 0;
	retcd = LOS_TaskCreate(&led1_task_handle, &task_param);
 
	if( retcd == LOS_OK) {
		PRINT_EMG("Create led1 task successful!\r\n");
	}
	else {
		PRINT_ERR("Create led1 task failed!\r\n");
	}
 
 
	task_param2.pcName = "led2_task";
	task_param2.pfnTaskEntry = led_task;
	task_param2.uwStackSize = 512;
	task_param2.usTaskPrio = 4;
	task_param2.uwArg = 3;
 
	retcd = LOS_TaskCreate(&led2_task_handle, &task_param2);
 
	if( retcd == LOS_OK) {
		PRINT_EMG("Create led2 task successful!\r\n");
	}
	else {
		PRINT_ERR("Create led2 task failed!\r\n");
	}
 
	LOS_Start();	
 
	/* Toggle LEDs. */
	while (true) {
		for (int i = 0; i < LEDS_NUMBER; i++) {
			bsp_board_led_invert(i);
			nrf_delay_ms(500);
		}
	}
}
library/nordic/liteos_keil.txt · Last modified: 2022/05/02 00:32 (external edit)