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

news2024/9/20 6:17:53

开源地址: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.coloradmin.cn/o/2148223.html

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

相关文章

1网络安全的基本概念

文章目录 网络安全的基本概念可以总结为以下几个方面&#xff1a; 网络安全的需求&#xff1a; 信息安全的重要性&#xff1a;信息安全是计算机、通信、物理、数学等领域的交叉学科&#xff0c;对于社会的发展至关重要。信息安全的目标&#xff1a;主要包括保密性、完整性、可用…

C/S架构与B/S架构的适用场景分析

C/S架构&#xff08;客户端/服务器架构&#xff09;与B/S架构&#xff08;浏览器/服务器架构&#xff09;在适用场景上各有特点&#xff0c;主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。 一、C/S架构的适用场景 1、高性能与交互性要求高的应用&…

闯关leetcode——58. Length of Last Word

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/length-of-last-word/description/ 内容 Given a string s consisting of words and spaces, return the length of the last word in the string. A word is a maximal substring consisting of…

docker从容器提取镜像并上传至dockerhub

一、使用commit从容器中提取镜像 例如 //docker commit 容器名 想要创建的镜像名:版本号 docker commit epsilon_planner epsilon_planner:latest导出完成后镜像如图所示 二、登陆dockerhub并创建仓库 登陆dockerhub&#xff0c;点击Create repository创建仓库&#xff0c…

小程序体验版无法正常请求接口,开启 调试可以正常请求

在本地开发工具可以正常访问小程序&#xff0c;上传代码后打开体验版&#xff0c;界面无法请求接口&#xff0c;手机小程序打开调试模式可以正常访问。这可以查看下小程序后台是否设置了服务器域名以及业务域名 然后查看小程序开发工具 - 详情 - 项目配置 重新上传代码&#xf…

北斗盒子TD20——水上作业的安全防线,落水报警守护生命

在广阔的水域上&#xff0c;水上作业人员面临着多变的环境和潜在的风险。近年来&#xff0c;随着海洋经济的快速发展&#xff0c;海上作业活动日益频繁&#xff0c;人员安全问题也日益凸显。传统的海上救援手段存在诸多不足&#xff0c;如救援响应时间长、定位不准确等。 水上…

SpringBoot教程(三十) | SpringBoot集成Shiro(权限框架)

SpringBoot教程&#xff08;三十&#xff09; | SpringBoot集成Shiro&#xff08;权限框架&#xff09; 一、 什么是Shiro二、Shiro 组件核心组件其他组件 三、流程说明shiro的运行流程 四、SpringBoot 集成 Shiro1. 添加 Shiro 相关 maven2. 添加 其他 maven3. 设计数据库表4.…

JSONC:为JSON注入注释的力量

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;广泛应用于Web开发、配置文件和数据存储等领域。 其简洁的语法和易于解析的特点&#xff0c;使得JSON成为了现代编程中不可或缺的一部分。然而&#xff0c;JSON的一个显著缺点是…

波分技术基础 -- MS-OTN介绍

什么是MS-OTN 由于OTN最小交叉颗粒度为ODU0&#xff0c;承载小颗粒业务时带宽利用率较低&#xff1b;且无法承载分组业务&#xff0c;随着MPLS-TP技术的成熟&#xff0c;MS-OTN时代来临。MS-OTN&#xff08;Multi-Service Optical Transport Network&#xff09;&#xff1a;核…

【论文解读系列】用于自监督点云表示的生成变分对比学习

Generative Variational-Contrastive Learning for Self-Supervised Point Cloud Representation | IEEE Transactions on Pattern Analysis and Machine Intelligence (acm.org) 作者&#xff1a;Bohua Wang; Zhiqiang Tian; Aixue Ye; Feng Wen; Shaoyi Du; Yue Gao 摘要 三…

VS code 查看 ${workspaceFolder} 目录指代路径

VS code 查看 ${workspaceFolder} 目录指代路径 引言正文 引言 在 VS code 创建与运行 task.json 文件 一文中我们已经介绍了如何创建属于自己的 .json 文件。在 VS code 中&#xff0c;有时候我们需要添加一些文件路径供我们导入自定义包使用&#xff0c;此时&#xff0c;我们…

Github Wiki 超链接 转 码云Gitee Wiki 超链接

Github Wiki 超链接 转 码云Gitee Wiki 超链接 Github 是 &#xff1a;[[相对路径]] Gitee 是 &#xff1a;[链接文字](./相对路径) 查找&#xff1a;\[\[(.*?)\]\] 替换&#xff1a;[$1]\(./$1\) 或替换&#xff1a;**[$1]\(./$1\)** &#xff08;码云的超链接&#xff0c;很…

实战18-Card封装

import Card from ../../components/Card/Index; import rvp from ../../utils/resposive/rvIndex;Component export default struct DomesticService {build() {Column() {Card() {//默认插槽Text("DomesticService")}}.width(100%).margin({ top: rvp(43) })} } im…

2024 Python3.10 系统入门+进阶(十五):文件及目录操作

目录 一、文件IO操作1.1 创建或打开文件1.2 读取文件1.2.1 按行读取1.2.2 多行读取1.2.3 完整读取 1.3 写入文件1.3.1 写入字符串1.3.2 写入序列 1.4 上下文管理1.4.1 with语句的使用1.4.2 上下文管理器(拓展----可以学了面向对象之后再回来看) 1.5 文件的遍历 二、os.path模块…

大语言模型-教育方向数据集

大语言模型-教育方向数据集 编号论文数据集1Bitew S K, Hadifar A, Sterckx L, et al. Learning to Reuse Distractors to Support Multiple-Choice Question Generation in Education[J]. IEEE Transactions on Learning Technologies, 2022, 17: 375-390.Televic, NL, https…

79页 PPT华为项目管理经典培训教材(高级)

读者朋友大家好&#xff0c;最近有会员朋友咨询晓雯&#xff0c;需要《79页PPT华为项目管理经典培训教材》资料&#xff0c;欢迎大家文末扫码下载学习。 一、华为项目管理理念方法 &#xff08;一&#xff09;项目管理基本概念与方法 项目启动 明确项目目标&#xff1a;华为…

SAP B1 流程实操 - 营销单据销售部分(上)

背景 在 SAP B1 中&#xff0c;最重要的模块就是【销售】&#xff0c;企业可能不涉及生产和库存&#xff08;贸易公司&#xff09;&#xff0c;甚至不涉及采购&#xff08;服务业&#xff09;&#xff0c;但是一定会有基本的 销售。本文中我们讲解 销售 模块的基本核心&#x…

【QT】基于HTTP协议的网络应用程序

目录 1 HTTP概述 2 QT中实现高层网络操作的类 3 使用HTTP类请求数据 4 基于HTTP协议的网络文件下载 1 HTTP概述 HTTP&#xff08;超文本传输协议&#xff09;是互联网上应用最为广泛的协议之一&#xff0c;它定义了客户端和服务器之间进行通信的规则。HTTP是一种无状态的协议…

rcc 不是内部或外部命令,也不是可运行的程序或批处理文件

D:\Windows Kits\10\bin\10.0.22621.0\x86 将上述路径添加到环境变量中&#xff0c;重启电脑

【微服务-注册中心】

注册中心的作用&#xff1a; 微服务将业务拆分成了一个一个服务&#xff0c;当实现一个业务的时需要调用多个服务&#xff0c;那么每个服务的调用都需要知道它的URL。如何更方便的调用&#xff0c;注册中心就出现了。 我们可以把注册中心当作通讯录&#xff0c;通讯录中记录了服…