【6】AT32F437 OpenHarmony轻量系统移植教程(3)

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

学习本文档的意义

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

2.学习OpenHarmony轻量系统开发

6.target_config.h文件适配

在//kernel/liteos_m/kernel/include/los_config.h文件中,有包含一个名为target_config.h的头文件,如果没有这个头文件,则会编译出错。

首先在target_config.h中包含at32f435_437.h头文件,主要修改OS_SYS_CLOCK和LOSCFG_SYS_HEAP_SIZE,

  • OS_SYS_CLOCK是配置LiteOS-M的时钟为系统时钟的参数,单位是hz。我们修改为at32437的主频288Mhz
  • LOSCFG_SYS_HEAP_SIZE系统的内存大小,at32437的SRAM大小为512kb,这里我们简单设置为300*1024

target_config.h具体内容

#ifndef _TARGET_CONFIG_H
#define _TARGET_CONFIG_H#include <stdint.h>
#include "at32f435_437.h"  包含了at32平台大量的宏定义#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus *//* =============================================================================System clock module configuration系统时钟模块配置参数
============================================================================= */
//OS_SYS_CLOCK是配置LiteOS-M的时钟为系统时钟的参数,单位是hz
//AT43F437ZMT7系统时钟为288MHz
#define OS_SYS_CLOCK                                        288*1000*1000
//LOSCFG_BASE_CORE_TICK_PER_SECOND表示操作系统每秒钟产生Tick的数量,Tick是指操作系 统节拍的时钟周期。时钟节拍就是系统以固定的频率产生中断(时基中断),并在中断中处理与时间相关的事件,推动所有任务 向前运行。时钟节拍需要依赖于硬件定时器
//在LiteOS-M中,系统延时和阻塞时间都是以Tick为单位的,配置LOSCFG_BASE_CORE_TICK_PER_SECOND 的值可以改变中断的频率,从而间接改变LiteOS的时钟周期(T=1/f)。如果将LOSCFG_BASE_CORE_TICK_PER_SECOND的值设置为1000, 那么LiteOS-M的时钟周期为1ms。过高的系统节拍中断频率意味着LiteOS-M内核将占用更多的CPU时间,因此会降低效率,一般将 LOSCFG_BASE_CORE_TICK_PER_SECOND的值设置为50~1000即可。
#define LOSCFG_BASE_CORE_TICK_PER_SECOND                    (1000UL)
//定时器裁剪的外部配置项。
#define LOSCFG_BASE_CORE_TICK_HW_TIME                       0
#define LOSCFG_BASE_CORE_TICK_WTIMER                        0
#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX                  (20000)/* =============================================================================Hardware interrupt module configuration硬件外部中断模块配置参数
============================================================================= */
//LOSCFG_PLATFORM_HWI是硬件中断定制配置参数,YES表明LiteOS-M接管了外部中断,一般建议设置为NO,即不接管中断。
#define LOSCFG_PLATFORM_HWI                                 0
// 是否使用OS默认的中断。1接管,0不接管。
#define LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT                 0   
//LOSCFG_PLATFORM_HWI_LIMIT这个宏定义表示 LiteOS-M支持最大的外部中断数,默认为96,一般不作修改,使用默认即可。
#define LOSCFG_PLATFORM_HWI_LIMIT                           0x200
/* =============================================================================Task module configuration任务模块的配置。
============================================================================= *///LOSCFG_BASE_CORE_TSK_LIMIT这个宏定义表示LiteOS支持的最大任务个数(除去空闲任务),默认为15。
#define LOSCFG_BASE_CORE_TSK_LIMIT                          60
//LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE这个宏定义表示空闲任务的栈大小,默认为0x500U字节
#define LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE                (0x600U)
//LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE宏定义表示定义默认的任务栈大小为0x2D0U字节,在任务创建的时候一般都会指定任务栈的大小,以适 配不一样的应用任务,而如果没有指定则使用默认值。
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE             (0x800U)
//LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE这个宏定义则表示任务最小需要的栈大小,栈大小应该是一个 合理的值,如果大小太大,可能会导致内存耗尽,最小的栈大小默认为0x130U。
#define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE                 (0x100U)
//LOSCFG_BASE_CORE_TIMESLICE这个宏定义表示是否使用时间片,在LiteOS-M一般都会使用时间片,故配置为YES。
#define LOSCFG_BASE_CORE_TIMESLICE                          1
//LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT这个宏定义表示具有相同优先级的任务的最长执行时间,单位为时钟节拍周期,默认配置为10。
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT                  1000
//LOSCFG_BASE_CORE_TSK_MONITOR这个宏定义表示任务栈监控模块定制的配置项,在LiteOS-M中默认打开。
#define LOSCFG_BASE_CORE_TSK_MONITOR                        1
#define LOSCFG_EXC_HARDWARE_STACK_PROTECTION                0
/* =============================================================================Semaphore module configuration信号量模块配置,信号量用于任务间的IPC通信,或者是用于任务与任务间的同步, 任务与中断间的同步等。
============================================================================= */
//LOSCFG_BASE_IPC_SEM这个宏定义表示信号量的配置项,配置为YES则表示默认使用信号量。
#define LOSCFG_BASE_IPC_SEM                                 1
//LOSCFG_BASE_IPC_SEM_LIMIT这个宏定义表示LiteOS-M最大支持信号量的个数,默认为20个,用户可以自定义设置信号量个数。
#define LOSCFG_BASE_IPC_SEM_LIMIT                           48
/*=============================================================================Mutex module configuration是互斥锁模块配置,互斥锁在LiteOS中起不可缺少的作用,如果某资源同时只准一个任务 访问,可以用互斥锁保护这个资源,互斥锁还具有优先级继承机制。
============================================================================= */
//LOSCFG_BASE_IPC_MUX这个宏定义表示互斥锁的配置项,配置为YES则表示默认使用互斥锁。
#define LOSCFG_BASE_IPC_MUX                                 1
//LOSCFG_BASE_IPC_MUX_LIMIT这个宏定义表示LiteOS-M最大支持互斥锁的个数,默认为15。
#define LOSCFG_BASE_IPC_MUX_LIMIT                           32
/*=============================================================================Queue module configuration消息队列模块配置,消息队列也是IPC通信的一种,用于任务与任务之间,任务与中断直接 的通信,可以存储有限的、大小固定的数据。
============================================================================= */
//队列功能开关,1表示打开,0表示关闭
//LOSCFG_BASE_IPC_QUEUE这个宏定义表示队列量的配置项,配置为YES则表示默认使用消息队列。
#define LOSCFG_BASE_IPC_QUEUE                               1
//LOSCFG_BASE_IPC_QUEUE_LIMIT这个宏定义表示LiteOS-M最大支持消息队列量的个数,默认为10。
#define LOSCFG_BASE_IPC_QUEUE_LIMIT                         24
/*=============================================================================Software timer module configuration软件定时器模块配置,使用软件定时器则必须要使用消息队列,否则不会使用软件定时器。
============================================================================= */
//软件定时器特性开关,1表示打开,0表示关闭
//LOSCFG_BASE_CORE_SWTMR这个宏定义表示软件定时器的配置项,配置为YES则表示默认使用软件定时器。
#define LOSCFG_BASE_CORE_SWTMR                              1
//对齐软件定时器特性开,1表示打开,依赖软件定时器特性打开,0表示关闭
#define LOSCFG_BASE_CORE_SWTMR_ALIGN                        0
//LOSCFG_BASE_CORE_SWTMR_LIMIT这个宏定义表示支持的最大软件定时器数量,而不是可用的软件定时器数量。默认为16。
#define LOSCFG_BASE_CORE_SWTMR_LIMIT                        5
/*=============================================================================Memory module configuration内存模块的配置项。
============================================================================= */
//声明了外部定义的一些变量,__heap_start为系统的起始地址,__heap_end为系统的结束地址,系统管理的内存均在这两个地址之间。
extern unsigned int __heap_start;
extern unsigned int __heap_end;
//这个宏决定系统是使用内核的内部堆内存还是用户的堆内存,默认为0(即使用内部的堆内存),大小为0x10000;如果用户需要基于外部的堆内存,那么可以将该宏设置为1。
#define LOSCFG_SYS_EXTERNAL_HEAP                            1
//系统的内存起始地址。
#define LOSCFG_SYS_HEAP_ADDR                                (void *)(UINTPTR)(&__heap_start)
//系统的内存大小,大小为结束地址-起始地址+1。
#define LOSCFG_SYS_HEAP_SIZE                                310*1024                //SRAM 384 kb(出厂默认),最大可设定为 512
//LOSCFG_MEM_MUL_POOL这个宏定义是配置内存模块内存池检查,默认打开。
#define LOSCFG_MEM_MUL_POOL                                 0
#define OS_SYS_MEM_NUM                                      20
#define LOSCFG_MEM_FREE_BY_TASKID                           0
//LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK这个宏定义是配置内存节点完整性检查,默认打开。
#define LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK                0
#define LOSCFG_STACK_POINT_ALIGN_SIZE                       4
/* =============================================================================Exception module configuration
============================================================================= */
//打印特性开关,1表示打开,0表示关闭
#define LOSCFG_KERNEL_PRINTF                                1#define LOSCFG_SUPPORT_LITTLEFS                             1#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */#endif /* _TARGET_CONFIG_H */

7.启动恢复子系统适配

启动恢复子系统适配bootstrap_lite/syspara_lite两个部件。请在vendor\artery\AT-START-F437\config.json中新增对应的配置选项。

{"subsystem": "startup","components": [{"component": "bootstrap_lite"         --- bootstrap_lite 部件},{"component": "syspara_lite",         --- syspara_lite 部件"features": ["enable_ohos_startup_syspara_lite_use_posix_file_api = true"]}]
},

1.在厂商ld链接脚本AT32F437xM_FLASH.ld中添加如下代码

 .zinitcall_array :{. = ALIGN(0x4) ;PROVIDE_HIDDEN (__zinitcall_core_start = .);KEEP (*(SORT(.zinitcall.core*)))KEEP (*(.zinitcall.core*))PROVIDE_HIDDEN (__zinitcall_core_end = .);. = ALIGN(0x4) ;PROVIDE_HIDDEN (__zinitcall_device_start = .);KEEP (*(SORT(.zinitcall.device*)))KEEP (*(.zinitcall.device*))PROVIDE_HIDDEN (__zinitcall_device_end = .);. = ALIGN(0x4) ;PROVIDE_HIDDEN (__zinitcall_bsp_start = .);KEEP (*(SORT(.zinitcall.bsp*)))KEEP (*(.zinitcall.bsp*))PROVIDE_HIDDEN (__zinitcall_bsp_end = .);. = ALIGN(0x4) ;PROVIDE_HIDDEN (__zinitcall_sys_service_start = .);KEEP (*(SORT(.zinitcall.sys.service*)))KEEP (*(.zinitcall.sys.service*))PROVIDE_HIDDEN (__zinitcall_sys_service_end = .);. = ALIGN(0x4) ;PROVIDE_HIDDEN (__zinitcall_app_service_start = .);KEEP (*(SORT(.zinitcall.app.service*)))KEEP (*(.zinitcall.app.service*))PROVIDE_HIDDEN (__zinitcall_app_service_end = .);. = ALIGN(0x4) ;PROVIDE_HIDDEN (__zinitcall_sys_feature_start = .);KEEP (*(SORT(.zinitcall.sys.feature*)))KEEP (*(.zinitcall.sys.feature*))PROVIDE_HIDDEN (__zinitcall_sys_feature_end = .);. = ALIGN(0x4) ;PROVIDE_HIDDEN (__zinitcall_app_feature_start = .);KEEP (*(SORT(.zinitcall.app.feature*)))KEEP (*(.zinitcall.app.feature*))PROVIDE_HIDDEN (__zinitcall_app_feature_end = .);. = ALIGN(0x4) ;PROVIDE_HIDDEN (__zinitcall_run_start = .);KEEP (*(SORT(.zinitcall.run*)))KEEP (*(.zinitcall.run*))PROVIDE_HIDDEN (__zinitcall_run_end = .);. = ALIGN(0x4) ;PROVIDE_HIDDEN (__zinitcall_test_start = .);KEEP (*(SORT(.zinitcall.test*)))KEEP (*(.zinitcall.test*))PROVIDE_HIDDEN (__zinitcall_test_end = .);. = ALIGN(0x4) ;PROVIDE_HIDDEN (__zinitcall_exit_start = .);KEEP (*(SORT(.zinitcall.exit*)))KEEP (*(.zinitcall.exit*))PROVIDE_HIDDEN (__zinitcall_exit_end = .);} > FLASH

8.修改启动文件

1.在target_config.h中通过LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT来配置操作系统接管还是不接管中断向量, 选择不接管的方式

  • 修改startup_at32f435_437.s文件,
    ```
    PendSV_Handler修改为HalPendSV

SysTick_Handler修改为OsTickHandler

```

总结

读者可以比对厂家雅特力提供的AT32F435_437_Firmware_Libraryat32f437_vendor,查看移植过程对AT32F435_437_Firmware_Library的修改

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

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

相关文章

秋招喜来,分享一份最新的面经

&#x1f4bc;岗位职责&#xff1a; 负责后端服务的开发与维护&#xff1b;技术预研和技术难点攻关&#xff0c;保障系统可用性、稳定性、和可扩展性&#xff1b;持续优化系统架构设计&#xff0c;提出问题解决方案。 &#x1f4cb;任职要求&#xff1a; 计算机或相关专业&a…

分拆逆势上会,兴福电子部分专利来自母公司,独立性被拷问

作者&#xff1a;Cindy 来源&#xff1a;IPO魔女 公司拟募集资金12.10亿元&#xff0c;保荐机构为天风证券。兴福电子2023年5月就提交了上市申请&#xff0c;期间经历了2轮问询&#xff0c;一年多时间就开启上会。 然而值得注意的是&#xff0c;兴福电子属于分拆上市&#xff…

亚马逊IP关联揭秘:发生ip关联如何处理

在亚马逊这一全球领先的电商平台上&#xff0c;IP关联是一个不可忽视的问题&#xff0c;尤其是对于多账号运营的卖家而言。本文将深入解析亚马逊IP关联的含义、影响以及应对策略&#xff0c;帮助卖家更好地理解和应对这一问题。 什么是亚马逊IP关联&#xff1f; 亚马逊IP关联…

Java高级Day51-apacheDBUtils

136.ApDBUtils 基本介绍 commons-dbutils 是 Apache 组织提供的一个开源JDBC工具类库&#xff0c;它是对JJDBC的封装&#xff0c;使用dbutils能极大简化jdbc编码的工作量 QueryRunner类&#xff1a;该类封装了SQL的执行&#xff0c;是线程安全的。可以实现增删改查和批处理 …

【最新华为OD机试E卷-支持在线评测】字符串变换最小字符串(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

MySQL练手题--日期连续类型(困难)

一、准备工作 Create table If Not Exists Failed (fail_date date); Create table If Not Exists Succeeded (success_date date); Truncate table Failed; insert into Failed (fail_date) values (2018-12-28); insert into Failed (fail_date) values (2018-12-29); inser…

map的使用

pair类型介绍 map底层的红⿊树节点中的数据&#xff0c;使⽤pair<Key, T>存储键值对数据 typedef pair<const Key, T> value_type; template <class T1, class T2> struct pair {typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair() : …

Unity的Text组件中实现输入内容的渐变色效果

要在Unity的Text组件中实现输入内容的渐变色效果&#xff0c;默认的Text组件不直接支持渐变色。但是&#xff0c;你可以通过以下几种方式实现&#xff1a; ### 1. **使用Shader**来实现渐变效果 通过自定义Shader为Text组件创建一个渐变效果。这是一个常用的做法&#xff0…

MySQL---创建数据库(基于SQLyog)

目录 0.前言 1.基本认识 1.1编码集 1.2检验规则 2.库的创建和销毁 2.1指令介绍 2.2你可能会出现的问题 3.查看数据库属性 4.创建指定数据库 5.创建表操作 0.前言 之前写过一篇这个关于表的创建和销毁的操作&#xff0c;但是当时是第一次学习&#xff0c;肯定有些地方…

初识 C 语言(一)

目录 一、 第一个 C 程序1. printf() 函数和 stdio.h 头文件2. main() 函数和 return 语句 二、类型和变量1. C 语言中的基本类型2. 变量的创建和命名规则3. 类型和变量的大小 三、printf() 函数和 scanf() 函数1. printf() 函数的使用2. 各种类型的输出格式3. scanf() 函数的使…

2. 网络模型、协议

网络模型、协议 一、OSI七层模型1、OSI七层作用2、数据封装、解封装 二、典型的协议1、应用层2、传输层2.1 TCP建立连接&#xff0c; 三次握手2.2 断开连接&#xff0c;四次挥手 3、网络层 一、OSI七层模型 Open System Interconnect 开放式系统互连模型 降低数据在网络中传输…

web基础—dvwa靶场(十一)CSP Bypass

CSP Bypass(CSP 绕过) 内容安全策略&#xff08;CSP&#xff09;用于定义脚本和其他资源可以从何处加载或执行&#xff0c;本模块将指导您根据开发人员犯下的常见错误来绕过该策略。 这些漏洞都不是 CSP 中的实际漏洞&#xff0c;它们都是实现 CSP 的方式中的漏洞。 绕过内容安…

智慧城市主要运营模式分析

(一)运营模式演变 作为新一代信息化技术落地应用的新事物,智慧城市在建设模式方面借鉴了大量工程建设的经验,如平行发包(DBB,Design-Bid-Build)、EPC工程总承包、PPP等模式等,这些模式在不同的发展阶段和条件下发挥了重要作用。 在智慧城市发展模式从政府主导、以建为主、…

Eigen之SelfAdjointEigenSolver

Eigen::SelfAdjointEigenSolver 是 Eigen 库中的一个类,用于计算自伴随矩阵(对称矩阵)的特征值和特征向量。自伴随矩阵是指其等于自身的共轭转置的矩阵,通常在物理和工程中出现,比如协方差矩阵、赫尔米特矩阵等。 常用用法: 计算特征值和特征向量: SelfAdjointEigenSol…

计算机毕业设计 基于Flask+Vue的博客系统 Python毕业设计 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Linux嵌入式驱动开发指南(速记版)---Linux基础篇

第一章 Ubuntu系统入门 uname -a #查看内核版本 cat etc/issue #查看系统版本 1.1 Linux磁盘管理 1.1.1 Linux磁盘管理基本概念 关键词&#xff1a; Linux 磁盘管理 挂载点 /etc/fstab文件 分区 ls /dev/sd* 联系描述&#xff1a; Linux 磁盘管理体系通过“挂载点”概念替代…

[数据集][目标检测]手机识别检测数据集VOC+YOLO格式9997张1类别

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

linux之mysql安装

1:mysql安装包下载 下载地址 可私信我直接获取安装包 2:linux下wget命令下载 下载地址 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz3:手动安装 将自己的安装包上传到对应的位置 解压 压缩包 使用命令 tar -zxvf mysql-5.7…

Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版

CleanMyMac X 4.15.6 for mac中文版下载是一款功能更加强大的系统优化清理工具&#xff0c;软件只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。CleanMyMac X 4.15.6 for mac 软件与最新macOS系统更加兼容&#xff0c;流畅地…

华为静态路由(route-static)

静态路由的组成 在华为路由器中&#xff0c;使用ip route-static命令配置静态路由。 一条静态路由主要包含以下要素&#xff1a; 目的地址&#xff1a;数据包要到达的目标IP地址 子网掩码&#xff1a;用于指定目的地址的网络部分和主机部分 下一跳地址&#xff08;可选&#…