【5】AT32F437 OpenHarmony轻量系统移植教程(2)

news2024/12/23 2:32:51

开源地址:https://gitee.com/AT32437_OpenHarmony

学习本文档的意义

1.学习移植OpenHarmony轻量系统到AT32全系列mcu上,本文档移植的具体型号为AT32F437ZMT7

2.学习OpenHarmony轻量系统开发

3.适配vprintf, vfprintf, printf, snprintf 和sprintf

1.首先获取AT32F437的底层驱动源代码(Firmware Library),我们需要从官方托管的gitee仓库AT32F435_437_Firmware_Library获取

2.找到at32f435_437_board.c文件,注释掉__io_putchar函数,使用fputc函数

// #if defined (__GNUC__) && defined (__clang__)
//   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
// #else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
// #endif

再注释掉setvbuf函数,这个函数影响适配适配printf

/**
  * @brief  initialize uart
  * @param  baudrate: uart baudrate
  * @retval none
  */
void uart_print_init(uint32_t baudrate)
{
  gpio_init_type gpio_init_struct;

// #if defined (__GNUC__) && !defined (__clang__)
//   setvbuf(stdout, NULL, _IONBF, 0);               //printf函数有关
// #endif

  /* enable the uart and gpio clock */
  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);
  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);

3.在/device/board/artery_board/atstartf437/liteos_m/config.gni新增_malloc_r, _realloc_r, _reallocf_r, _free_r, _memalign_r, 和 _malloc_usable_size_r函数的wrap链接选项。

board_ld_flags = [ # 链接选项,与厂商Makefile中的LDFLAGS变量对应。
  "-Xlinker",
  "--gc-sections",# 需要的Linker 配置
  "--specs=nano.specs", # 为了使用printf函数
  "--specs=nosys.specs", # 为了使用printf函数
    "-Wl,--wrap=_calloc_r",
    "-Wl,--wrap=_malloc_r",
    "-Wl,--wrap=_realloc_r",
    "-Wl,--wrap=_reallocf_r",
    "-Wl,--wrap=_free_r",
    "-Wl,--wrap=_memalign_r",
    "-Wl,--wrap=_malloc_usable_size_r",
]

4.然后重写printf和sprintf函数,具体实现查看dprintf.c

#include <stdarg.h>
#include <stdio.h>
#include "securec.h"
#include "los_interrupt.h"

unsigned int intSave = 0;

//print函数的buffer大小
#define BUFSIZE  512 

static void dputs(char const *s, int (*pFputc)(int n, FILE *cookie), void *cookie)
{
    intSave = LOS_IntLock();

    while (*s) {
        pFputc(*s++, cookie);
    }

    LOS_IntRestore(intSave);
}

int printf(const char *__restrict __format, ...)
{
    char buf[BUFSIZE] = { 0 };
    int len;
    va_list ap;
    va_start(ap, __format);
    len = vsnprintf_s(buf, sizeof(buf), BUFSIZE - 1, __format, ap);
    va_end(ap);
    if(len > 0) {
        dputs(buf, fputc, 0);
    } else {
        dputs("printf error!\n", fputc, 0);
    }
    return len;
}

5.在main.c的main.c里面初始化串口打印函数uart_print_init

3.适配vprintf, vfprintf, printf, snprintf 和sprintf

1.首先获取AT32F437的底层驱动源代码(Firmware Library),我们需要从官方托管的gitee仓库AT32F435_437_Firmware_Library获取

2.找到at32f435_437_board.c文件,注释掉__io_putchar函数,使用fputc函数

// #if defined (__GNUC__) && defined (__clang__)
//   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
// #else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
// #endif

再注释掉setvbuf函数,这个函数影响适配适配printf

/**
  * @brief  initialize uart
  * @param  baudrate: uart baudrate
  * @retval none
  */
void uart_print_init(uint32_t baudrate)
{
  gpio_init_type gpio_init_struct;

// #if defined (__GNUC__) && !defined (__clang__)
//   setvbuf(stdout, NULL, _IONBF, 0);               //printf函数有关
// #endif

  /* enable the uart and gpio clock */
  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);
  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);

3.在/device/board/artery_board/atstartf437/liteos_m/config.gni新增_malloc_r, _realloc_r, _reallocf_r, _free_r, _memalign_r, 和 _malloc_usable_size_r函数的wrap链接选项。

board_ld_flags = [ # 链接选项,与厂商Makefile中的LDFLAGS变量对应。
  "-Xlinker",
  "--gc-sections",# 需要的Linker 配置
  "--specs=nano.specs", # 为了使用printf函数
  "--specs=nosys.specs", # 为了使用printf函数
    "-Wl,--wrap=_calloc_r",
    "-Wl,--wrap=_malloc_r",
    "-Wl,--wrap=_realloc_r",
    "-Wl,--wrap=_reallocf_r",
    "-Wl,--wrap=_free_r",
    "-Wl,--wrap=_memalign_r",
    "-Wl,--wrap=_malloc_usable_size_r",
]

4.然后重写printf和sprintf函数,具体实现查看dprintf.c

#include <stdarg.h>
#include <stdio.h>
#include "securec.h"
#include "los_interrupt.h"

unsigned int intSave = 0;

//print函数的buffer大小
#define BUFSIZE  512 

static void dputs(char const *s, int (*pFputc)(int n, FILE *cookie), void *cookie)
{
    intSave = LOS_IntLock();

    while (*s) {
        pFputc(*s++, cookie);
    }

    LOS_IntRestore(intSave);
}

int printf(const char *__restrict __format, ...)
{
    char buf[BUFSIZE] = { 0 };
    int len;
    va_list ap;
    va_start(ap, __format);
    len = vsnprintf_s(buf, sizeof(buf), BUFSIZE - 1, __format, ap);
    va_end(ap);
    if(len > 0) {
        dputs(buf, fputc, 0);
    } else {
        dputs("printf error!\n", fputc, 0);
    }
    return len;
}

5.在main.c的main.c里面初始化串口打印函数uart_print_init

alt text

4.添加at32f437驱动库

前面提到首先获取AT32F437的底层驱动源代码(Firmware Library),我们需要从官方托管的gitee仓库AT32F435_437_Firmware_Library获取。

把原厂的驱动文件放置在device\soc\artery\at32f4xx\libraries和device\soc\artery\at32f4xx\liteos_m目录下面,为了消除编译报错需要进行一些修改

1.device/soc/artery/at32f4xx/liteos_m/include/at32f435_437.h中typedef int32_t INT32;typedef uint32_t UINT32;注释掉


//typedef int32_t  INT32;
typedef int16_t  INT16;
typedef int8_t   INT8;
//typedef uint32_t UINT32;

2.device/soc/artery/at32f4xx/liteos_m/include/at32f435_437.h中,FALSE修改为AT_FALSE,TRUE修改为AT_TRUE,避开宏的重定义

typedef enum {AT_FALSE = 0, AT_TRUE = !AT_FALSE} confirm_state; 

3.device/soc/artery/at32f4xx/libraries/drivers/inc/at32f435_437_def.h中注释掉


//#define UNUSED(x)                        (void)x /* to avoid gcc/g++ warnings */

4.device/soc/artery/at32f4xx/libraries/drivers/src/at32f435_437_crm.c中注释DUMMY_NOP();这个函数

/**
  * @brief  select system clock source
  * @param  value
  *         this parameter can be one of the following values:
  *         - CRM_SCLK_HICK
  *         - CRM_SCLK_HEXT
  *         - CRM_SCLK_PLL
  * @retval none
  */
void crm_sysclk_switch(crm_sclk_type value)
{
  CRM->cfg_bit.sclksel = value;
  //DUMMY_NOP();
}

5.device/soc/artery/at32f4xx/liteos_m/include/at32f435_437_board.h中 添加 #define AT_START_F437_V1

6.device/soc/artery/at32f4xx/liteos_m/include/at32f435_437.h中相关宏为修改AT32F437ZMT7,相关代码如下

/**
  * tip: to avoid modifying this file each time you need to switch between these
  *      devices, you can define the device in your toolchain compiler preprocessor.
  */

#define AT32F437xx

/**
  * define with package
  */


#define AT32F437Zx

/**
  * define with memory density
  */

#define AT32F437xM

7.device/soc/artery/at32f4xx/liteos_m/include/at32f435_437_conf.h中添加

alt text

#if !defined  TRUE
#define TRUE  AT_TRUE
#endif
#if !defined  FALSE
#define FALSE AT_FALSE
#endif

8.所有的at32437驱动文件都要包含头文件#include "los_compiler.h",为了解决UNUSED没有定义的问题

alt text

5.内核子系统适配

在vendor\artery\AT-START-F437\config.json添加内核子系统及相关配置,如下所示:

    "subsystems": [ 
        {
            "subsystem": "kernel",
            "components": [
                {
                    "component": "liteos_m"
                }
            ]
        }
    ],

4.添加at32f437驱动库

前面提到首先获取AT32F437的底层驱动源代码(Firmware Library),我们需要从官方托管的gitee仓库AT32F435_437_Firmware_Library获取。

把原厂的驱动文件放置在device\soc\artery\at32f4xx\libraries和device\soc\artery\at32f4xx\liteos_m目录下面,为了消除编译报错需要进行一些修改

1.device/soc/artery/at32f4xx/liteos_m/include/at32f435_437.h中typedef int32_t INT32;typedef uint32_t UINT32;注释掉


//typedef int32_t  INT32;
typedef int16_t  INT16;
typedef int8_t   INT8;
//typedef uint32_t UINT32;

2.device/soc/artery/at32f4xx/liteos_m/include/at32f435_437.h中,FALSE修改为AT_FALSE,TRUE修改为AT_TRUE,避开宏的重定义

typedef enum {AT_FALSE = 0, AT_TRUE = !AT_FALSE} confirm_state; 

3.device/soc/artery/at32f4xx/libraries/drivers/inc/at32f435_437_def.h中注释掉


//#define UNUSED(x)                        (void)x /* to avoid gcc/g++ warnings */

4.device/soc/artery/at32f4xx/libraries/drivers/src/at32f435_437_crm.c中注释DUMMY_NOP();这个函数

/**
  * @brief  select system clock source
  * @param  value
  *         this parameter can be one of the following values:
  *         - CRM_SCLK_HICK
  *         - CRM_SCLK_HEXT
  *         - CRM_SCLK_PLL
  * @retval none
  */
void crm_sysclk_switch(crm_sclk_type value)
{
  CRM->cfg_bit.sclksel = value;
  //DUMMY_NOP();
}

5.device/soc/artery/at32f4xx/liteos_m/include/at32f435_437_board.h中 添加 #define AT_START_F437_V1

6.device/soc/artery/at32f4xx/liteos_m/include/at32f435_437.h中相关宏为修改AT32F437ZMT7,相关代码如下

/**
  * tip: to avoid modifying this file each time you need to switch between these
  *      devices, you can define the device in your toolchain compiler preprocessor.
  */

#define AT32F437xx

/**
  * define with package
  */


#define AT32F437Zx

/**
  * define with memory density
  */

#define AT32F437xM

7.device/soc/artery/at32f4xx/liteos_m/include/at32f435_437_conf.h中添加

image.png

#if !defined  TRUE
#define TRUE  AT_TRUE
#endif
#if !defined  FALSE
#define FALSE AT_FALSE
#endif

8.所有的at32437驱动文件都要包含头文件#include "los_compiler.h",为了解决UNUSED没有定义的问题

image.png

5.内核子系统适配

在vendor\artery\AT-START-F437\config.json添加内核子系统及相关配置,如下所示:

    "subsystems": [ 
        {
            "subsystem": "kernel",
            "components": [
                {
                    "component": "liteos_m"
                }
            ]
        }
    ],

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis自定义TypeHandler,直接存储枚举类对象

在这篇文章中&#xff0c;我们已经知道如何使用枚举类直接接受前端的数字类型参数&#xff0c;省去了麻烦的转换。如果数据库需要保存枚举类的code&#xff0c;一般做法也是代码中手动转换&#xff0c;那么能不能通过某种机制&#xff0c;省去转换&#xff0c;达到代码中直接保…

中间件安全(二)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 前文链接&#xff1a;中间件安全&#xff08;一&#xff09; 本文主要讲解Couchdb数据库未授权越权漏洞&#xff08;CVE-2017-12635&#xff09;。 靶场链接&#xff1a;Vu…

(11)(2.1.2) DShot ESCs(三)

文章目录 前言 5 附加配置 前言 DShot 是一种数字 ESC 协议&#xff0c;它允许快速、高分辨率的数字通信&#xff0c;可以改善飞行器控制&#xff0c;这在多旋翼和 quadplane 应用中特别有用。 5 附加配置 DShot更新率 发送 DShot 脉冲的频率可以通过SERVO_DSHOT_RATE配置…

jvm中的程序计数器、虚拟机栈和本地方法栈

引言 本文主要介绍一下jvm虚拟机中的程序计数器、虚拟机栈和本地方法栈。 程序计数器 作用 作用&#xff1a;记录下一条jvm指令的执行地址。 下面具体描述一下程序计数器的作用。 这里有两个代码&#xff0c;右边的为源代码&#xff0c;左边为编译之后的字节码。 当我们…

#面试系列-腾讯后端一面

03.腾讯后端一面 项目相关 面试官可能是 Go 方向的&#xff0c;我面试的是 Java 方向的&#xff0c;所以面试官也没有问我简历上的项目&#xff0c;主要问了实验室中做的项目&#xff0c;哪个项目比较有技术挑战&#xff1f; 面试主要问了计算级网络相关&#xff0c;以及如果让…

企业应该怎样合理使用AI技术与混合云?

企业合理使用AI技术和混合云的关键在于明确业务目标、评估技术需求并制定相应的战略规划。下面是一些指导原则和步骤&#xff0c;可以帮助企业有效地结合AI技术和混合云&#xff1a; 1. 定义业务目标 明确需求&#xff1a;确定哪些业务流程可以通过AI优化&#xff0c;哪些数据处…

Python和R及MATLAB和C与Lua去相关生物医学图像处理和神经网络物理学及数学变换算法

&#x1f3af;要点 主成分分析降维显微镜成像精度评估算法脑电图磁共振成像降噪算法图像颜色分离显现特征球面转换:主成分分析和零相位分量分析零相位分量分析和主成分分析平均互相关算法图像白化计算噪声协方差和绘制白化数据高能物理分类器分离不同信号白化变换优化批量归一…

【贪心算法】贪心算法二

贪心算法二 1.最长递增子序列2.递增的三元子序列3.最长连续递增序列 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.最长递增子序列 题目链…

828华为云征文 | 使用Flexus X实例搭建Dubbo-Admin服务

一、Flexus X实例简介 华为云推出的Flexus云服务&#xff0c;作为专为中小企业及开发者设计的新一代云服务产品&#xff0c;以其开箱即用、体验卓越及高性价比而著称。其中的Flexus云服务器X实例&#xff0c;更是针对柔性算力需求量身打造&#xff0c;能够智能适应业务负载变化…

pick你的第一个人形机器人——青龙强化学习环境测试

文章目录 一、环境配置二、开始训练三、训练成果 最近感受到的大趋势是具身智能&#xff0c;强化学习&#xff0c;模仿学习做人形机器人&#xff0c;这个赛道很火&#xff0c;颇有前些年全力投入做自动驾驶的架势&#xff0c;正好最近用强化学习解决POMDP问题接触到了强化学习&…

Java研学-数据字典(一)

一 需求分析 1 分析 在项目中会有很多的下拉框&#xff0c;这些下拉框的特点&#xff0c;就是以键值对的形式存在&#xff0c;其中 value&#xff08;如 id&#xff1a;1&#xff0c;2… &#xff09;&#xff0c;key&#xff08;展示给用户的内容&#xff09;&#xff0c;数据…

SSC338D/SSC338Q CA7*2+IPU5M/Multi-sensorISP: HDR/3DNR

SSC338D/SSC338Q系列产品是高度集成的多媒体片上系统&#xff08;SoC&#xff09;产品&#xff0c;适用于IP摄像机、车载摄像机和USB摄像机等高分辨率智能视频录制应用。该芯片包括32位双核RISC处理器、高级图像信号处理器&#xff08;ISP&#xff09;、高性能MJPEG/H.264/H.26…

Maven-三、聚合

Maven 文章目录 Maven前言创建聚合模块设置管理的子模块总结 前言 在使用了maven进行多模块开发后&#xff0c;随着模块变多会变得难以管理&#xff0c;所以需要使用聚合模块进行统一管理。 分模块开发的项目中会有多个模块&#xff0c;那么可以单独使用一个模块专门管理整个工…

毫米波雷达预警功能 —— 倒车预警(RCTA)

文档声明&#xff1a; 以下资料均属于本人在学习过程中产出的学习笔记&#xff0c;如果错误或者遗漏之处&#xff0c;请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。 笔记资料仅供学习交流使用&#xff0c;转载请标明出处&#xff0c;谢谢配…

【Web】御网杯信息安全大赛2024 wp(全)

目录 input_data admin flask 如此多的FLAG 一夜醒来之全国CTF水平提升1000倍&#x1f60b; input_data 访问./.svn后随便翻一翻拿到flag admin dirsearch扫出来 访问./error看出来是java框架 测出来是/admin;/路由打Spring View Manipulation(Java)的SSTI https:/…

HTML中直接创建一个“onoff”图形开关包括css+script

1. HTML中直接创建一个“onoff”图形开关 下面是一个完整的HTML文档示例 在HTML中直接创建一个“onoff”图形开关&#xff08;通常指的是一个类似于物理开关的UI组件&#xff0c;可以切换开或关的状态&#xff09;&#xff0c;并不直接支持&#xff0c;因为HTML主要用于内容的…

[数据集][目标检测]中草药类型识别检测数据集VOC+YOLO格式7976张45类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7976 标注数量(xml文件个数)&#xff1a;7976 标注数量(txt文件个数)&#xff1a;7976 标注…

STM32篇:按键点亮LED灯

输入&#xff08;按键&#xff09;&#xff1a;KEY1---PA0 KEY2---PA1 输出&#xff08;LED灯&#xff09;&#xff1a;LED1---PB8 LED2---PB9

数字孪生技术如何推动企业可持续发展:监控与优化企业可持续目标的新视角

数字孪生助力可持续发展的新机遇 在全球推进可持续发展战略的背景下&#xff0c;企业需要创新型的技术工具来实现高效管理&#xff0c;数字孪生技术成为了实现这一目标的重要工具。数字孪生通过虚拟与现实的互动&#xff0c;将物理世界中的企业活动、运营数据及生产流程进行精…

FreeSWITCH 简单图形化界面29 - 使用mod_xml_curl 动态获取配置、用户、网关数据

FreeSWITCH 简单图形化界面29 - 使用mod_xml_curl 动态获取配置、用户、网关数据 FreeSWITCH GUI界面预览安装FreeSWITCH GUI先看使用手册1、简介2、安装mod_xml_curl模块3、配置mod_xml_curl模块3、编写API接口4、测试一下5、其他注意的地方 FreeSWITCH GUI界面预览 http://m…