鸿蒙移植随笔

本文详细介绍了STM32MP157平台上的鸿蒙Liteos_a系统中,串口(UART)的底层实现、GenericTimer架构以及存储设备管理。作者通过实际移植过程,解析了内核打印函数、APP控制台打印机制,以及关键驱动程序uart_ops的工作原理,同时探讨了GenericTimer在系统中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32MP157—鸿蒙Liteos_a移植随笔

  • 硬件平台:韦东山嵌入式Linxu开发板(STM32MP157)
  • 软件平台:运行于VMware Workstation Pro 下 UbuntuLTS18.04_x64 系统


第一章 串口移植

1.1 Liteos_a串口架构分析

1.1.1 内核打印函数实现

内核打印函数为PRINT_RELEASE(fmt, args...),宏定义于openharmony\kernel\liteos_a\kernel\include\los_printf.h

#define PRINT_DEBUG(fmt, args...)    LOS_LkPrint(LOS_DEBUG_LEVEL, __FUNCTION__, __LINE__, fmt, ##args)
#define PRINT_INFO(fmt, args...)     LOS_LkPrint(LOS_INFO_LEVEL, __FUNCTION__, __LINE__, fmt, ##args)
#define PRINT_WARN(fmt, args...)     LOS_LkPrint(LOS_WARN_LEVEL, __FUNCTION__, __LINE__, fmt, ##args)
#define PRINT_ERR(fmt, args...)      LOS_LkPrint(LOS_ERR_LEVEL, __FUNCTION__, __LINE__, fmt, ##args)
#define PRINTK(fmt, args...)         LOS_LkPrint(LOS_COMMON_LEVEL, __FUNCTION__, __LINE__, fmt, ##args)
#define PRINT_EMG(fmt, args...)      LOS_LkPrint(LOS_EMG_LEVEL, __FUNCTION__, __LINE__, fmt, ##args)
#define PRINT_RELEASE(fmt, args...)  LOS_LkPrint(LOS_COMMON_LEVEL, __FUNCTION__, __LINE__, fmt, ##args)
#define PRINT_TRACE(fmt, args...)    LOS_LkPrint(LOS_TRACE_LEVEL, __FUNCTION__, __LINE__, fmt, ##args)

其调用关系为:可以看到其最终实现的是输出单个字符

PRINT_EMG(fmt, args...)
LOS_LkPrint(LOS_EMG_LEVEL, __FUNCTION__, __LINE__, fmt, ##args)
LK_FUNC g_osLkHook
VOID OsLkDefaultFunc(INT32 level, const CHAR *func, INT32 line, const CHAR *fmt, va_list ap);
VOID LkDprintf(const CHAR *fmt, va_list ap)
VOID OsVprintf(const CHAR *fmt, va_list ap, OutputType type)
VOID UartPuts(const CHAR *s, UINT32 len, BOOL isLock)
UINT32 UartPutsReg(UINTPTR base, const CHAR *s, UINT32 len, BOOL isLock)
STATIC VOID UartPutStr(UINTPTR base, const CHAR *s, UINT32 len)
STATIC VOID UartPutcReg(UINTPTR base, CHAR c)

在这里插入图片描述

1.1.2 APP控制台打印

其架构为:

  • 我们编写的应用程序,调用printf时,那些信息从哪里打印出来?——控制台 console,但是它可能代表不同的设备。
  • 串口上运行程序,控制台——**串口 serial **。
  • 远程登录板子后运行程序,控制台——远程登录终端 telnet

控制台的实现分为4层

/dev/console1
/dev/serial
/dev/telnet
/dev/uartdev-0
/dev/uartdev-1
uart_ops
1.1.2.1 建立联系
  • 对于console <–> serial,其建立联系使用INT32 system_console_init(const CHAR *deviceName)函数

    1. 分辨出:使用具体何种device(serial / telnet)
    2. 建立联系

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

  • 对于serial <–> uart,其建立联系使用INT32 virtual_serial_init(const CHAR *deviceName)函数

    从名字上看,/dev/serial被称为virtual serial,虚拟串口。它只是起一个中转的作用,无论是APP还是内核,使用/dev/serial,都是再次跳转去执行具体串口设备驱动程序的函数

在这里插入图片描述

1.1.2.2 uart与具体的dev

这是真正操作硬件的驱动程序,它分为两部分:device_tdriver_t

  • device_t中设置资源,比如寄存器物理基地址、中断号等
  • driver_t中提供函数,比如device_probedevice_attach函数
    • 当内核发现有名字系统的device_tdriver_t
    • 就会调用driver_t中的device_probedevice_attach函数
    • 在里面根据device_t得到资源、注册驱动register_driver

这种写驱动程序的方法,被称为分离:操作函数、资源分离。
以后想换一个硬件,只需要修改device_t就可以,driver_t保存不变。

  • device_t
    在这里插入图片描述

  • driver_t
    在这里插入图片描述

  • uartdev_t

    /dev/uartdev-0对应的驱动程序时uartdev_fops,它通过uart_ops来操作硬件。
    在这里插入图片描述

  • uart_ops

    在UART驱动程序里,我们只需要提供硬件操作部分:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

    uart_ops里有4个函数:

    • config:配置串口,比如波特率等
    • startup:启动串口,比如注册中断处理函数、启动串口
    • start_tx:发送字符串
    • shutdown:关闭串口

    串口就两大功能:发送数据、接收数据
    在Liteos-a中,发送数据比较简单:没有使用中断,而是使用查询方式逐个发送核心是UartPutcReg
    接收数据时使用中断,所以需要注册串口接收中断处理函数,它要做的事情是:

    • 发生中断时,读取硬件获得字符,可能有多个字符
    • 处理特殊字符:比如不`\r`换为`\n`
    • 通知上层代码:udd->recv(udd, buf, count);

1.2 uart串口架构

在这里插入图片描述

第二章 GenericTimer架构分析

在这里插入图片描述

第三章 存储设备

在这里插入图片描述

第四章 根文件系统的生成过程

在这里插入图片描述

### 如何在鸿蒙系统移植 Boost 库 #### 兼容性和配置概述 Boost库是一个广泛使用的C++开源库集合,提供了丰富的功能模块。然而,在将其移植鸿蒙系统(HarmonyOS)时,需要注意系统的兼容性问题以及具体的编译环境设置。鸿蒙系统支持多种编程语言和工具链,但对于像Boost这样的第三方库,可能需要额外的适配工作。 以下是关于如何在鸿蒙系统移植Boost库的关键点: 1. **确认目标硬件架构** 鸿蒙系统运行于不同的硬件平台上,包括ARM Cortex-M系列微控制器、ARM Cortex-A处理器以及其他嵌入式设备。因此,在移植前需明确目标硬件架构及其对应的交叉编译器版本[^1]。 2. **选择合适的Boost模块** 并非所有的Boost库都需要被移植鸿蒙系统中。开发者应根据实际需求挑选必要的模块,例如`boost::asio`用于网络通信或者`boost::filesystem`处理文件操作等功能模块。这有助于减少不必要的复杂度并优化资源占用率[^2]。 3. **调整构建脚本** 使用b2作为主要构建工具来生成适合鸿蒙平台的目标二进制文件。修改现有的build script使其能够识别新的target platform settings like compiler flags (-march=armv7-a), linker options etc.[^3] 4. **解决依赖关系冲突** 如果某些Boost子项目的实现依赖外部库(比如zlib),则同样也需要把这些依赖项迁移到鸿蒙环境中去。可以通过预集成的方式预先打包好这些静态链接库供后续使用[^4]. 5. **测试与验证** 完成上述步骤之后,进行全面的功能回归测试以确保所有预期行为都能正常运作无误。特别关注内存管理部分因为不同RTOS之间可能存在细微差异影响最终效果表现. ```bash # 示例命令行参数设置 (假设采用GCC作为cross-compiler) ./bootstrap.sh --prefix=/path/to/install/directory \ --with-toolset=gcc-arm-none-eabi # 编辑 user-config.jam 文件指定自定义toolchain路径 using gcc : arm : /usr/bin/arm-linux-gnueabihf-g++ ; # 执行正式编译过程 ./b2 toolset=gcc-arm target-os=linux threading=single link=static variant=release install ``` --- ####
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值