This action will force synchronization from Huawei LiteOS/LiteOS, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
对于嵌入式设备,由于芯片型号和外设差异较大,且资源有限,所以物联网操作系统无法像 Windows/Linux 那样适配集成所有驱动,因此通常会先适配部分芯片/开发板。为了让操作系统运行在其他芯片/开发板上,此时就需要移植。
开发板的移植包括 CPU架构移植、板级/外设驱动移植和操作系统的移植。
本指南基于STM32芯片平台,以正点原子STM32F407开发板为例介绍如何快速移植LiteOS,其中并不涉及CPU架构移植。
表格列出了LiteOS源码的目录,其中加粗字体的目录/文件在移植过程中需要修改。
表 1 LiteOS源码目录
一级目录 | 二级目录/文件 | 说明 |
---|---|---|
arch | 芯片架构支持 | |
build | LiteOS编译系统需要的配置及脚本 | |
compat | LiteOS提供的CMSIS-RTOS 1.0和2.0接口 | |
components | 组件代码 | |
demos | 组件和内核的demo | |
doc | LiteOS使用文档 | |
include | components中各模块的头文件 | |
kernel | 内核代码 | |
lib | libc/zlib/posix接口 | |
osdepends | LiteOS提供的部分OS适配接口 | |
targets | bsp | 通用板级支持包 |
Cloud_STM32F429IGTx_FIRE | 野火STM32F429(ARM Cortex-M4)开发板的开发工程源码包 | |
qemu-virt-a53 | Cortex-A53的qemu开发工程源码包 | |
realview-pbx-a9 | Cortex-A9的qemu开发工程源码包 | |
STM32F072_Nucleo | STM32F072_Nucleo(ARM Cortex-M0)开发板的开发工程源码包 | |
STM32F103_FIRE_Arbitrary | 野火STM32F103(ARM Cortex-M3)霸道开发板的开发工程源码包 | |
STM32F769IDISCOVERY | STM32F769IDISCOVERY(ARM Cortex-M7)开发板的开发工程源码包 | |
... | 其他开发板的开发工程源码包 | |
Kconfig | ||
Kconfig.* | 不同厂商开发板menuconfig配置文件 | |
Makefile | ||
bsp.mk | ||
test | 内核测试用例集合套 | |
tests | 组件测试用例集合套 | |
tools | build/config | LiteOS支持的各开发板的编译配置文件,移植新的开发板时,需要在这个目录下增加这个新开发板的编译配置文件 |
menuconfig | LiteOS编译所需的menuconfig脚本 | |
Makefile | 整个LiteOS的Makefile | |
.config | 开发板的编译配置文件,默认为Cloud_STM32F429IGTx_FIRE开发板的配置文件,移植时需要替换成新开发板的编译配置文件 |
target目录下保存了当前已经支持的开发板工程源码。当移植新开发板时,应该在target目录下增加该开发板的目录,目录结构和代码可以参考当前已支持的开发板的目录。例如:
LiteOS源码仓在码云上,使用master分支。
本指南以国内主流STM32学习板-正点原子STM32F407开发板为例进行移植。该开发板的介绍可参考官方网站:探索者STM32F407开发板。
JLink。
本指南主要基于LiteOS Studio集成开发环境进行移植,烧录工具为JLink,同时使用STM32CubeMX软件生成裸机工程。
STM32CubeMX下载,本指南使用的是6.0.1版本。
除了LiteOS Studio,同时还需要安装git工具、make构建软件、arm-none-eabi编译器软件、C/C++扩展、JLink烧录软件、USB转串口驱动,这些软件的安装均可参考LiteOS Studio安装指南。
所有软件安装完毕后,需要重启计算机。
须知: 对于板载STLink仿真器的STM32开发板,需要先把STLink仿真器刷成JLink仿真器,再按照JLink的方式烧写。可以参考LiteOS Studio官方文档的“STM32工程示例”中的“ST-Link仿真器单步调测”。
在正式开始移植前,可以先验证当前开发环境是否能成功编译LiteOS代码并完成烧录。目前开源LiteOS支持了若干开发板,如:Cloud_STM32F429IGTx_FIRE、STM32F769IDISCOVERY、STM32L431_BearPi等。可以视情况验证环境:
验证方法可以参考LiteOS Studio官方文档的“STM32工程示例”中的“使用入门”(只需关注其中的“打开工程”、“目标板配置”、“编译配置-编译代码”和“烧录配置-烧录”)。
STM32CubeMX 是意法半导体(ST) 推出的一款图形化开发工具,支持 STM32 全系列产品,能够让用户轻松配置芯片外设引脚和功能,并一键生成C语言的裸机工程。
裸机工程可以为移植提供硬件配置文件和外设驱动文件,同时可以测试开发板的基本功能。以下介绍正点原子STM32F407的裸机工程创建过程。
打开STM32CubeMX软件,点击菜单栏“File”在下拉菜单中选择“New Project”,如下图所示:
选择开发板芯片。
选择对应的开发板MCU(对于正点原子STM32F407开发板,选择STM32F407ZG),如下图所示:
可以根据需要,自定义配置外设。这里仅配置了最基本的时钟、串口和LED灯、以及烧录调试方式,已经能满足LiteOS运行所需的基本硬件需求。
配置时钟引脚。
选择“Pinout & Configuration”标签页,在左边的“System Core”中选择RCC,设置HSE(High Speed Clock,外部高速时钟)为Crystal/ Ceramic Resonator(晶振/陶瓷谐振器),即采用外部晶振作为 HSE 的时钟源,如下图所示:
配置时钟频率。
将标签页切换为“Clock Configuration”。STM32F407芯片的最高时钟为168MHz,在HCLK处输入168并且回车即可完成配置,如下图所示。其他开发板的配置方式也类似。
将标签页切换回“Pinout & Configuration”。下图是正点原子STM32F407开发板的配置方法。对于其他开发板,可以参考开发板的原理图进行相应配置。
图 1 配置TIMER
仍然在“Pinout & Configuration”标签页中,在左边的“System Core”中选择“SYS”,将“Debug”设置为“Serial Wire”,即SWD接口。该接口适用于STLink和JLink。
工程配置中,需要设置工程名、代码保存路径、编译工具链/IDE、代码使用的堆栈大小以及HAL库版本。CubeMX 可以生成 Makefile、MDK-ARM、IAR 等 IDE 工程。本指南基于GCC编译工具链,所以Toolchain/IDE需要选择Makefile。将标签页切换到“Project Manager”,选择左边的“Project”标签,如下图所示:
为便于外设相关代码维护,建议勾选生成外设驱动的.c/.h文件。选择左边的“Code Generator”标签,如下图所示:
按以上步骤设置完外设和工程配置后,就可以生成裸机工程代码了,如下图所示:
生成的裸机工程目录结构如下表所示:
表 1 裸机工程目录结构
使用LiteOS Studio打开裸机工程。
a. 打开LiteOS Studio软件:
b. 点击工具栏Open Project图标,选择生成的裸机工程,如下图所示:
在裸机工程Core\Src\main.c文件中编写串口循环输出并且LED灯闪烁测试代码。
a. 添加头文件:
#include <stdio.h>
b. 在main()函数的while(1)循环中添加如下代码:
printf("hello\n");
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
c. 在/* USER CODE BEGIN 4 */中添加函数:
__attribute__((used)) int _write(int fd, char *ptr, int len)
{
(void)HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF);
return len;
}
配置目标板。
在“工程配置”界面中点击“目标板”,在“操作”列中点击“+”后,在出现的空行中填入STM32F407开发板信息,选中新增的开发板后,点击确认按钮保存,如下图所示:
注:新增开发板需要注意目标板名称要以STM32开头,当前Huawei LiteOS Studio软件暂时只能识别STM32开头的目标板名称(在LiteOS工程中,目标板名称对应LiteOS\targets目录下开发板名称)。
编译。
在裸机工程根目录下的Makefile文件上点击右键->设置为Makefile文件,然后编译工程,编译生成的二进制镜像文件在工程根目录的build目录下,如下图所示:
烧录。
a. 配置烧录器。
在“工程配置”界面中点击“烧录器”,参照下图进行配置,要烧录的二进制镜像文件就是上一步编译生成的bin文件,配置项中的“连接速率”、“加载地址”保持默认即可。
b. 点击“工具栏”上的“烧录”按钮,进行烧录。
烧录成功后,可以在终端界面看到如下输出:
c. 查看串口输出。
点击“工具栏”上“串口终端”图标,打开串口终端界面。如下图,只需设置与开发板连接的实际端口号,并打开串口开关。开发板按下复位RESET按钮后,即可在“串口终端”界面中看到不断输出hello,同时也可以观察到开发板的LED灯闪烁。
说明: 如果想更详细的了解LiteOS Studio的使用,可以参考LiteOS Studio官方文档的“STM32工程示例”。
下面的移植工作会基于现有的裸机工程进行,大致步骤如下:
正点原子STM32F407开发板使用的是STM32F4芯片,可以参考Cloud_STM32F429IGTx_FIRE工程代码。
在LiteOS源码target目录下拷贝Cloud_STM32F429IGTx_FIRE目录,并将目录重命名为新开发板名,比如STM32F407_OpenEdv。下表是STM32F407_OpenEdv目录中的子目录和文件,只列出了和本次移植相关的内容,不相关的文件和目录可以删除(其中不相关的目录包括Driver,Hardware,Lib)。
表 1 新增开发板目录结构
芯片外设配置的头文件,只需保留main.h、stm32f4xx.h、stm32f4xx_hal_conf.h、sys_init.h、system_stm32f4xx.h、tim.h、usart.h |
|
芯片外设配置的源文件,只需保留main.c、system_stm32f4xx.c、usart.c、sys_init.c、user_task.c、tim.c |
|
将芯片外设驱动文件替换为对应芯片的文件。
修改芯片外设驱动源文件system_xxx.c。
不同开发板的system_stm32f4xx.c文件中内容不一样,所以该文件无法使用在新开发板上,移植时可以直接替换为裸机工程中对应的文件。对于正点原子STM32F407开发板,在裸机工程中的对应文件为:Core\Src\system_stm32f4xx.c。
修改芯片外设驱动头文件。
删除原stm32f429芯片外设驱动的头文件STM32F407_OpenEdv\Inc\stm32f429xx.h,替换为新开发版对应的文件,可以直接使用裸机工程中的Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h文件。
同时注意在某些文件中可能引用了原芯片外设的头文件stm32f429xx.h,需要在文件中改为stm32f407xx.h。目前在新增开发板STM32F407_OpenEdv目录下,只有include\asm\hal_platform_ints.h中的引用了stm32f429xx.h,修改 #include "stm32f429xx.h" 为 #include "stm32f407xx.h"。
移植HAL库配置文件。
直接用裸机工程中的Core\Inc\stm32f4xx_hal_conf.h文件替换STM32F407_OpenEdv\Inc\stm32f4xx_hal_conf.h即可。
删除随机数代码。
目前不需要使用随机数,为减少不必要的移植工作,先注释随机数相关代码。搜索关键字“rng”,在STM32F407_OpenEdv目录下找到以下几处使用,将其删除:
Src\sys_init.c中:
#include "hal_rng.h"
int atiny_random(void *output, size_t len)
{
return hal_rng_generate_buffer(output, len);
}
Src\main.c中:
#include "hal_rng.h"
hal_rng_config();
在STM32F407_OpenEdv\Src\main.c硬件初始化函数的第一行,添加初始化HAL库的函数HAL_Init():
VOID HardwareInit(VOID)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM3_Init();
}
设置系统主频。
可在STM32F407_OpenEdv\include\hisoc\clock.h文件中设置,一般将时间频率设置为SystemCoreClock,实现代码为:
#define get_bus_clk() SystemCoreClock
修改系统时钟配置函数SystemClock_Config()。
函数定义在STM32F407_OpenEdv\Src\sys_init.c文件中,可以直接使用裸机工程Core\Src\main.c中的函数实现。
#include "los_typedef.h"
#include "platform.h"
extern TimControllerOps g_cpupTimerOps;
#include "sys_init.h"
#include "los_hwi.h"
VOID TimInit(VOID)
{
MX_TIM3_Init();
}
VOID TimerHwiCreate(VOID)
{
UINT32 ret;
ret = LOS_HwiCreate(TIM_IRQ, 0, 0, TIM3_IRQHandler, 0); // 16: cortex-m irq num shift
if (ret != 0) {
printf("ret of TIM3 LOS_HwiCreate = %#x\n", ret);
return;
}
HAL_TIM_Base_Start_IT(&htim3);
}
UINT64 GetTimerCycles(VOID)
{
static UINT64 bacCycle;
static UINT64 cycleTimes;
UINT64 cycles = 0;
UINT64 swCycles = htim3.Instance->CNT;
if (swCycles < bacCycle) {
cycleTimes++;
}
bacCycle = swCycles;
cycles = swCycles + cycleTimes * TIMER3_RELOAD;
return cycles;
}
TimControllerOps g_cpupTimerOps = {
.timInit = TimInit,
.timHwiCreate = TimerHwiCreate,
.timGetTimerCycles = GetTimerCycles
};
USER_SRC = \
os_adapt/os_adapt.c \
Src/main.c \
Src/system_stm32f4xx.c \
Src/tim.c \
Src/usart.c \
Src/sys_init.c \
Src/user_task.c \
Src/gpio.c
#include "stm32f4xx_hal.h"
使用裸机工程的串口初始化文件Core\Src\usart.c和Core\Inc\usart.h替换LiteOS源码中的targets\STM32F407_OpenEdv\Src\usart.c和targets\STM32F407_OpenEdv\Inc\usart.h。
在targets\STM32F407_OpenEdv\Inc\usart.h中增加对STM32F4系列芯片的HAL驱动头文件的引用:
#include "stm32f4xx_hal.h"
#include "los_typedef.h"
#include "uart.h"
extern UartControllerOps g_genericUart;
在targets\STM32F407_OpenEdv\Src\usart.c文件尾部添加如下函数定义:
VOID UsartInit(VOID)
{
MX_USART1_UART_Init();
}
VOID UsartWrite(const CHAR c)
{
(VOID)HAL_UART_Transmit(&huart1, (UINT8 *)&c, 1, DEFAULT_TIMEOUT);
}
UINT8 UsartRead(VOID)
{
UINT8 ch;
(VOID)HAL_UART_Receive(&huart1, &ch, sizeof(UINT8), 0);
return ch;
}
STATIC VOID UartHandler(VOID)
{
(VOID)uart_getc();
}
INT32 UsartHwi(VOID)
{
if (huart1.Instance == NULL) {
return LOS_NOK;
}
HAL_NVIC_EnableIRQ(USART1_IRQn);
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC);
(VOID)LOS_HwiCreate(NUM_HAL_INTERRUPT_UART, 0, 0, UartHandler, NULL);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
return LOS_OK;
}
UartControllerOps g_armGenericUart = {
.uartInit = UsartInit,
.uartWriteChar = UsartWrite,
.uartReadChar = UsartRead,
.uartHwiCreate = UsartHwi
};
STM32F407_OpenEdv\liteos.ld是新开发板的链接脚本,需要根据开发板实际情况修改stack,flash,ram的值,可以参考裸机工程链接脚本STM32F407ZGTx_FLASH.ld中的设定值进行设置。
同时为适配LiteOS操作系统,链接脚本中增加了如下代码:
增加了一个vector,用于初始化LiteOS:
/* used by the startup to initialize liteos vector */
_si_liteos_vector_data = LOADADDR(.vector_ram);
/* Initialized liteos vector sections goes into RAM, load LMA copy after code */
.vector_ram :
{
. = ORIGIN(RAM);
_s_liteos_vector = .;
*(.data.vector) /* liteos vector in ram */
_e_liteos_vector = .;
} > RAM AT> FLASH
在.bss段中增加“__bss_end”变量的定义,因为在LiteOS中使用的是这个变量而非“__bss_end__”变量:
__bss_end = _ebss;
设置LiteOS使用的内存池的地址,包括起始地址和结束地址:
. = ALIGN(8);
__los_heap_addr_start__ = .;
__los_heap_addr_end__ = ORIGIN(RAM) + LENGTH(RAM) - _Min_Stack_Size - 1;
将所有“Cloud_STM32F429IGTx_FIRE”替换成“STM32F407_OpenEdv”。
STM32F407_OpenEdv目录结构相对于Cloud_STM32F429IGTx_FIRE工程的目录少了一些文件和子目录,需要在Makefile中删除对这些目录文件的引用,即删除如下内容:
ifeq ($(LOSCFG_DEMOS_SENSORHUB), y)
BSP_DRIVER_SRC = \
Drivers/i2c/i2c.c \
Drivers/mpu6050/mpu6050.c
C_SOURCES += $(BSP_DRIVER_SRC)
endif
ifeq ($(LOSCFG_COMPONENTS_FS), y)
ifeq ($(LOSCFG_FATFS_USE_SD_CARD), y)
FS_SRC += \
Src/fatfs_sd_hal.c \
Src/stm324x9i_eval_sd.c \
Src/sd_diskio.c
endif
ifeq ($(LOSCFG_FATFS_USE_SPI_FLASH), y)
FS_SRC += \
Src/fatfs_spi_hal.c
endif
ifeq ($(LOSCFG_COMPONENTS_FS_SPIFFS), y)
FS_SRC += \
Src/spiffs_hal.c
endif
C_SOURCES += $(FS_SRC)
endif
BSP_INC = \
--I $(LITEOSTOPDIR)/targets/TM32F407_OpenEdv/Drivers/BSP/STM324x9I_EVAL \
HARDWARE_INC = \
-I $(LITEOSTOPDIR)/targets/Cloud_STM32F429IGTx_FIRE/Hardware/Inc
BOARD_INCLUDES += $(HARDWARE_INC)
HARDWARE_SRC = \
${wildcard Hardware/Src/*.c}
C_SOURCES += $(HARDWARE_SRC)
USER_SRC = \
Src/flash_adaptor.c \
BSP_DRIVER_INC = \
-I $(LITEOSTOPDIR)/targets/TM32F407_OpenEdv/Drivers/i2c \
-I $(LITEOSTOPDIR)/targets/TM32F407_OpenEdv/Drivers/mpu6050
BOARD_INCLUDES += $(BSP_DRIVER_INC)
搜索关键字“STM32F429”,替换为“STM32F407”。
如果需要添加自己的源文件,可以将该源文件添加到“USER_SRC”变量中。
仿照LOSCFG_PLATFORM_STM32F429IGTX,在targets\bsp\Makefile文件中增加STM32F4对应的HAL编译:
else ifeq ($(LOSCFG_PLATFORM_STM32F407ZGTX), y)
STM32F407ZGTX_HAL_SRC = \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c \
drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c
LOCAL_SRCS = $(STM32F407ZGTX_HAL_SRC)
修改targets\bsp.mk。
可以参考其他开发板的编译配置,新增正点原子开发板的配置,如下所示:
######################### STM32F407ZGTX Options###############################
else ifeq ($(LOSCFG_PLATFORM_STM32F407ZGTX), y)
LITEOS_CMACRO_TEST += -DSTM32F407xx
HAL_DRIVER_TYPE := STM32F4xx_HAL_Driver
新增STM32F407_OpenEdv.config。
在tools\build\config文件夹下复制Cloud_STM32F429IGTx_FIRE.config文件,并重命名为STM32F407_OpenEdv.config,同时将文件内容中的“Cloud_STM32F429IGTx_FIRE”改为“STM32F407_OpenEdv”,将“LOSCFG_PLATFORM_STM32F429IGTX”改为“LOSCFG_PLATFORM_STM32F407ZGTX”。
修改targets\Kconfig.stm32以添加menuconfig选项。
a. 仿照config LOSCFG_PLATFORM_STM32F429IGTX添加:
config LOSCFG_PLATFORM_STM32F407ZGTX
bool "STM32F407_OpenEdv"
select LOSCFG_USING_BOARD_LD
select LOSCFG_ARCH_CORTEX_M4
select LOSCFG_CORTEX_M_NVIC
select LOSCFG_CORTEX_M_SYSTICK
select LOSCFG_DRIVER_HAL_LIB
b. choice条目下面的help追加STM32F407_OpenEdv。
c. config LOSCFG_PLATFORM下面新增:
default "STM32F407_OpenEdv" if LOSCFG_PLATFORM_STM32F407ZGTX
说明: STM32F407_OpenEdv应该是增加新开发板的目录中新增的开发板目录名称。
修改.config。
复制tools\build\config\STM32F407_OpenEdv.config文件到LiteOS根目录下,并重命名为.config以替换根目录下原有的.config文件。
通过编译和烧录,验证移植后的LiteOS源码,验证方法可以参考“使用LiteOS Studio测试裸机工程”。
说明: 对于移植后的LiteOS源码,其Makefile文件在源码根目录下,编译生成的镜像文件Huawei_LiteOS.bin在根目录的out目录下。
将Huawei_LiteOS.bin烧录到开发板后,复位开发板,可以在串口看到类似下图的输出:
LiteOS的main函数定义在开发板工程的main.c文件中,主要负责硬件和内核的初始化工作,并在初始化完成后开始任务调度。在main() 调用的OsMain函数中,会调用OsAppInit() 创建一个名为“app_Task”的任务,该任务的处理函数为app_init()。用户可以直接在app_init()中添加自己的代码,可以为一段功能代码或者是一个任务。
LiteOS支持多任务。在LiteOS 中,一个任务表示一个线程。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。LiteOS实现了任务之间的切换和通信,帮助开发者管理业务程序流程。开发者可以将更多的精力投入到业务功能的实现中。
在LiteOS中,通过函数LOS_TaskCreate()创建任务,LOS_TaskCreate()函数原型在kernel\base\los_task.c文件中定义。调用LOS_TaskCreate()创建一个任务后,任务就会进入就绪状态。
下面以一个循环亮灯任务为例,介绍LiteOS任务创建流程。
在移植好的开发板工程“targets\开发板名称\Src\user_task.c”文件中按照如下流程创建任务:
编写任务函数,创建一个闪着不同闪烁频率的LED指示灯的任务:
STATIC UINT32 LedTask(VOID)
{
while (1) {
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
LOS_TaskDelay(TASK_DELAY);
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
LOS_TaskDelay(TASK_DELAY);
}
return 0;
}
配置LED指示灯任务的参数并创建任务:
STATIC UINT32 LedTaskCreate(VOID)
{
INT32 ret;
UINT32 taskId = 0;
TSK_INIT_PARAM_S ledTaskParam;
ret = memset_s(&ledTaskParam, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
if (ret != EOK) {
return ret;
}
ledTaskParam.pfnTaskEntry = (TSK_ENTRY_FUNC)LedTask;
ledTaskParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
ledTaskParam.pcName = "ledTask";
ledTaskParam.usTaskPrio = LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO;
ledTaskParam.uwResved = LOS_TASK_STATUS_DETACHED;
return LOS_TaskCreate(&taskId, &ledTaskParam);
}
在硬件初始化函数HardwareInit()中增加对LED灯的初始化:
#include "gpio.h"
MX_GPIO_Init();
在user_task.c文件中的app_init(),添加对LED任务创建函数的调用:
VOID app_init(VOID)
{
printf("app init!\n");
(VOID)LedTaskCreate();
DemoEntry();
}
说明: 此代码示例只完成了基本任务的创建,开发者可以根据实际需求创建自己的任务。
参考LiteOS Studio官方文档的“STM32工程示例”中的“使用入门”,其中有“调试器”相关介绍。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。