当前位置: 首页 > news >正文

【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的修改

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • filebeat采集挂载出来的/home/Logs下的日志过程
  • 『玉竹』基于Laravel 开发的博客、微博客系统和Android App
  • spring中对于servlet API的封装---springWeb
  • 计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-18
  • 行人动作行为识别系统源码分享
  • 自定义类型
  • Flink加载维度数据
  • JBoss EJBInvokerServlet CVE-2013-4810 反序列化漏洞
  • Android——内部/外部存储
  • Fyne ( go跨平台GUI )中文文档-容器和布局 (四)
  • 操作系统笔记三
  • C++笔记---set和map
  • ElasticSearch数据类型和分词器
  • (十五)、把自己的镜像推送到 DockerHub
  • python中网络爬虫框架
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Akka系列(七):Actor持久化之Akka persistence
  • angular2开源库收集
  • Apache Pulsar 2.1 重磅发布
  • canvas绘制圆角头像
  • CSS相对定位
  • Java 最常见的 200+ 面试题:面试必备
  • java第三方包学习之lombok
  • Linux Process Manage
  • magento 货币换算
  • Mybatis初体验
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Spring Cloud中负载均衡器概览
  • STAR法则
  • Webpack 4x 之路 ( 四 )
  • 爱情 北京女病人
  • 初识MongoDB分片
  • 服务器从安装到部署全过程(二)
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端临床手札——文件上传
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 思维导图—你不知道的JavaScript中卷
  • 我的zsh配置, 2019最新方案
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​数据结构之初始二叉树(3)
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • # centos7下FFmpeg环境部署记录
  • # 达梦数据库知识点
  • (搬运以学习)flask 上下文的实现
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (翻译)terry crowley: 写给程序员
  • (生成器)yield与(迭代器)generator
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)JPA - JQPL 实现增删改查
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)