IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> lite-os + STM32F091 + IAR 工程模板 -> 正文阅读

[嵌入式]lite-os + STM32F091 + IAR 工程模板

前言

liteos官方, 书上,网上能找到的模板工程大部分都是STM32F103, STM32F407的lite-os例子.

这次,我想在STM32F091上用用lit-os.
环境 : lite-os在git上的旧版, IAR8.40.2, HAL库,JLINK, STM32F091

通过试验调试器只能用JLINK. 使用STLINKV2无法指定STM32F091的烧录算法,导致下载程序,调试失败。

移植完成后,可以进入建立的任务,可以执行延时函数。说明lite-os的任务调度好使。
是否能用HAL库正确的操作STM32F091, 后续再验证。

移植完的工程模板(IAR)

src_IAR_liteos_stm32f091_com8_mcu.zip

试验

先要找到lite-os用于MCU的版本
lite-os的官方主库在gitee上。https://gitee.com/LiteOS/LiteOS.git
发行库在github上。https://github.com/LiteOS/LiteOS.git

初步研究了一下,发现华为官方最新版已经不支持第三方的IDE(IAR, MDK)工程,只支持自家的HUAWEI-LiteOS-Studio。

HUAWEI-LiteOS-Studio现在还不是很成熟,支持的调试器和MCU种类都不全,我们公司没法直接用HUAWEI-LiteOS-Studio来开发(即使是新开的硬软件工程)。如果以后支持的调试器和MCU种类全了,可以考虑用HUAWEI-LiteOS-Studio重新开新工程。

去github上的lite-os发行库看了一下,华为官方能给出第三方IDE使用lite-os的MCU工程模板,只存在于废弃版本中。

在这里插入图片描述
希望lite-os以后能重新出官方最新版本的支持第三方IDE的工程模板.
跟领导商量了一下,他可以接受使用lite-os的旧版的MCU工程。
那行,开搞。

将lite-os旧版,移植到STM32F091的试验

确定一下lite-os内核版本
在lite-os代码中看到了一个版本宏LITEOS_VER(\kernel\include\los_config.h),可以看到我用的这个lite-os版本为 Huawei LiteOS Kernel V200R001c50, 其实这个版本号是lite-os的大版本号,看不出具体是啥时候出的版本,只能通过git的Revision Graph和log来看具体的版本出品时间。

用CubeMX开一个STM32F091的工程,将MCU管脚设定都改成自己电路相同的定义,配置调试口,RCC, 时钟,生成HAL库工程。

将lite-os旧版中的目录 arch,components,examples,kernel 拷贝到自己工程的lite-os目录下。
将官方给的IAR模板工程中的OS_CONFIG目录拷贝到自己工程下的OS_CONFIG目录。
在这里插入图片描述
\arch\arm\arm-m\目录下只保留 cortex-m0\iar\los_dispatch_iar.S

为了看工程方便,重新命名group, 重新添加文件,这样在IAR中看到的文件组织和实际目录的结构相同,加入文件,看个人喜好。
在这里插入图片描述
在IAR中添加lite-os包含路径。

$PROJ_DIR$/../Core/Inc
$PROJ_DIR$/../Drivers/STM32F0xx_HAL_Driver/Inc
$PROJ_DIR$/../Drivers/STM32F0xx_HAL_Driver/Inc/Legacy
$PROJ_DIR$/../Drivers/CMSIS/Device/ST/STM32F0xx/Include
$PROJ_DIR$/../Drivers/CMSIS/Include

// 下面是新加的,包含lite-os头文件路径。这句是注释,不要写到头文件配置中。
$PROJ_DIR$/../OS_CONFIG
$PROJ_DIR$/../lite_os/kernel/include
$PROJ_DIR$/../lite_os/components/cmsis
$PROJ_DIR$/../lite_os/components/cmsis/2.0
$PROJ_DIR$/../lite_os/arch/arm/arm-m/include
$PROJ_DIR$/../lite_os/kernel/base/include
$PROJ_DIR$/../lite_os/examples/include
$PROJ_DIR$/../lite_os/kernel/extended/include

在这里插入图片描述

编译时,会编译不过。
根据报错提示,在IAR中的group中不要加入\components\cmsis\cmsis_liteos2.c. 因为 cmsis_liteos2.c 是当作头文件来包含的。

在lite_os\components\cmsis\cmsis_liteos.c中可以看到cmsis_liteos2.c 是当作头文件包含的。

#include "los_config.h"

#if (CMSIS_OS_VER == 1)
#include "1.0/cmsis_liteos1.c"
#elif (CMSIS_OS_VER == 2)
#include "2.0/cmsis_liteos2.c"
#endif

在这里插入图片描述
再编译,通过。

根据自己的F0MCU的实际RAM大小,修改 OS_CONFIG\target_config.h 中的 BOARD_SRAM_SIZE_KB 的值,STM32F091的RAM是32K, 将这个值改成32。

/*=============================================================================
                                       Memory module configuration
=============================================================================*/

/**
 * Without modify default link script and startup file, In order to use all the remaining SRAM space
 * as LiteOS`s heap, User must config the start address and size of the board`s memory, Because in
 * KEIL and IAR compiler, the program can`t get the end address of SRAM.
 */
#define BOARD_SRAM_START_ADDR     0x20000000
#define BOARD_SRAM_SIZE_KB        32
#define BOARD_SRAM_END_ADDR       (BOARD_SRAM_START_ADDR + 1024 * BOARD_SRAM_SIZE_KB)

尝试注释掉BOARD_SRAM_SIZE_KB,编译不过。找到了用BOARD_SRAM_SIZE_KB的地方osMemSystemInit(), osTaskEntry()。
这说明,只有用户自己通过BOARD_SRAM_SIZE_KB指定了RAM容量,lite-os才知道RAM多大。lite-os只能管理1块MCU内部RAM, 如果有接外部RAM(不止1块RAM), 需要自己实现除内部RAM之外RAM的管理。

LITE_OS_SEC_TEXT_INIT UINT32 osMemSystemInit(VOID)
{
    UINT32 uwRet = LOS_OK;

    uwRet = LOS_MemInit((VOID *)OS_SYS_MEM_ADDR, OS_SYS_MEM_SIZE);

#if ((LOSCFG_PLATFORM_EXC == YES) && (LOSCFG_SAVE_EXC_INFO == YES))
    osExcRegister(OS_EXC_TYPE_MEM, (EXC_INFO_SAVE_CALLBACK)LOS_MemExcInfoGet, g_aucMemMang);
#endif
    return uwRet;
}
/*****************************************************************************
 Function : LOS_TaskCreateOnly
 Description : Create a task and suspend
 Input       : pstInitParam --- Task init parameters
 Output      : puwTaskID    --- Save task ID
 Return      : LOS_OK on success or error code on failure
 *****************************************************************************/
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *puwTaskID, TSK_INIT_PARAM_S *pstInitParam)
{
    UINT32 uwTaskID = 0;
    UINTPTR uvIntSave;
    VOID  *pTopStack;
    VOID  *pStackPtr;
    LOS_TASK_CB *pstTaskCB;
    UINT32 uwErrRet = OS_ERROR;

    if (NULL == puwTaskID)
    {
        return LOS_ERRNO_TSK_ID_INVALID;
    }

    if (NULL == pstInitParam)
    {
        return LOS_ERRNO_TSK_PTR_NULL;
    }

    if (NULL == pstInitParam->pcName)
    {
        return LOS_ERRNO_TSK_NAME_EMPTY;
    }

    if (NULL == pstInitParam->pfnTaskEntry)
    {
        return LOS_ERRNO_TSK_ENTRY_NULL;
    }

    if ((pstInitParam->usTaskPrio) > OS_TASK_PRIORITY_LOWEST)
    {
        return LOS_ERRNO_TSK_PRIOR_ERROR;
    }

    if (((pstInitParam->usTaskPrio) == OS_TASK_PRIORITY_LOWEST)
        && (pstInitParam->pfnTaskEntry != OS_IDLE_TASK_ENTRY))
    {
        return LOS_ERRNO_TSK_PRIOR_ERROR;
    }

    if (pstInitParam->uwStackSize > OS_SYS_MEM_SIZE)
    {
        return LOS_ERRNO_TSK_STKSZ_TOO_LARGE;
    }

根据资料上的讲解,还需要看一下LOSCFG_PLATFORM_HWI的定义。
看了一下官方提供的los_config.h中LOSCFG_PLATFORM_HWI的值,居然是YES.

/**
 * @ingroup los_config
 * Configuration item for hardware interrupt tailoring
 */
#ifndef LOSCFG_PLATFORM_HWI
#define LOSCFG_PLATFORM_HWI                                 YES
#endif

因为这个模板,是华为lite-os旧版中提供的IAR工程,针对STM32F103的。
具体能不能在任务中用HAL库正确操作STM32F091再说。第三方提供的demo工程,一般都是 LOSCFG_PLATFORM_HWI = NO.
优先按照官方的工程来。

在工程中查 LOSCFG_PLATFORM_HWI 的引用点,已经看到了。
如果测试的过程中出现问题,再将 LOSCFG_PLATFORM_HWI改成NO试试。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 14:14:35  更:2021-08-14 14:15:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 16:03:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码