BES2300 代码主架构笔记

2023-10-27

1、BES的内核用的是RTX的内核,并且用了ARM推广的CMSIS_RTOS API接口;这样做的好处是可以方便内核的更换,方便移植上层代码。
在这里插入图片描述在这里插入图片描述
2、程序是从RTX_CM_LIB.H里面的_main_init()开始的,里面包括了内核的初始化,堆栈的设置,线程任务main的创建,内核的开启。
此函数以绝对的物理内存地址定义在内存开始段中,上电直接运行。
在这里插入图片描述
3、然后,程序开启了第一个线程main的运行,在Main.cpp文件中。
在这里插入图片描述
4、需要提及的是CMSIS_RTOS API中,经常以这种风格来定义线程跟定时器,邮件通讯等的配置;
在这里插入图片描述
app_thread为线程loop函数,osThread其实是一个宏
在这里插入图片描述
其实现在就是取os_thread_def_app_thread的地址,而这个地址从何而来?
一般在线程创建的文件中,会看到如下图这样的定义:
在这里插入图片描述
osThreadDef其实也是一个宏
在这里插入图片描述
到了这里,我们知道了os_thread_def_app_thread的数据源了,是一个结构体变量初始化赋值,看其结构类型:
在这里插入图片描述
至此我们应该就能清楚明白了整个线程创建的定义了,通过osThreadDef设置线程名,优先级,堆栈大小,通过osThread获取配置的结构体变量的指针,作为形参传入osThreadCreate()函数中。
在这里插入图片描述
5、以上的案列,我们看到了最重要的一个线程的创建过程,这个线程就是app_thread线程,它在app_thread.c里面的app_os_init()函数里面创建,由main调用或者app_init()调用。这个线程将是以后应用模块修改跟添加的主要线程。
6、下面,我们看一下app_thread线程里面模块设计的实现。
在这里插入图片描述
我们可以看到在app_thread线程中,反复的在获取邮件信息app_mailbox_get(),并传入mod_handler[]里面
在这里插入图片描述
看其数据类型
在这里插入图片描述
是一个函数指针数组,再看其数组下标的定义。
在这里插入图片描述
我们再看一下,谁用到了mod_handler[]。
在这里插入图片描述
看下app_set_threadhandle原型
在这里插入图片描述
到此,我们看到了app_thread线程中,设置各模块,事件回调函数的API。
全局搜索下,谁调用了app_set_threadhandle?
在这里插入图片描述
7、继续研究app_thread线程中,模块的架构以及驱动层的调用。我们就从app_set_threadhandle的调用,进入到APP_MODUAL_BATTERY模块,分析具体的代码。
在这里插入图片描述
可以看到app_battery_open()调用了 app_set_threadhandle(APP_MODUAL_BATTERY, app_battery_handle_process);其中,app_battery_handle_process()就是app_thread线程回调的模块调用函数。
另外可以看一下文件目录结构:在这里插入图片描述在这里插入图片描述
后续自己的模块可以按照它SDK的风格,加入进来。
我们继续看代码,
在这里插入图片描述
app_battery_open()是由app_init()调用的,初始化battery模块。
其中,battery模块用到的全局变量为
在这里插入图片描述
数据结构为

在这里插入图片描述
在这里插入图片描述
从变量的初始化,我们可以看到客制化的设置,在tgt_hardware.h里面
在这里插入图片描述
其他客制化的设置,也可以一并在这个头文件里面看看。
在app_battery_handle_process()里面,我们可以看到
在这里插入图片描述
电池电量的获取以及更新,并通过BLE传给手机。
在这里插入图片描述
通过APP_BATTERY_STATUS_OVERVOLT看到app_battery_irqhandler()里面发起的事件
在这里插入图片描述
app_battery_measure.cb在app_battery_open()中有定义,

在这里插入图片描述
在这里插入图片描述
可以看到app_battery_event_process()发出的邮件信息。
回到app_battery_irqhandler(),

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过追踪,我们看到了定时器开启的app_battery_timehandler()回调。
至此,我们看到了battery模块电池电量的获取,中间层的流程,定时器,间隔固定时间通过驱动层获取当前电量的值,给到模块事件处理,再给到应用层。
关于定时器的配置和设置,上面有讲过CMSIS_RTOS的风格,这里就不追踪了。
8、我们看下battery模块,用到的ADC驱动层的代码应用。

在这里插入图片描述
在这里插入图片描述
通过这个入口所在的文件,看下驱动层所在的文件路径:
在这里插入图片描述
后续驱动的调用跟运用,可以看这个文件夹里面的文件。
回到代码:
在这里插入图片描述
可以看到,传入的回调函数指针,赋值给了 gpadc_event_cb[channel] ,另外,用到驱动的地方,要加互斥锁。
在这里插入图片描述
追踪gpadc_event_cb的调用,进入hal_gpadc_irq_handler()

在这里插入图片描述
在这里插入图片描述
通过上图,我们看到 gpadc_event_cb调用了app_battery_irqhandler,并传入了ADC扫描到的值。
在这里插入图片描述
以上,为ADC最底层接口。
我们再通过hal_gpadc_irq_handler(),追踪

在这里插入图片描述
在这里插入图片描述
以上,是ADC开启中断获取的流程 ,至此,驱动层开启ADC获取电量值的流程。
9、除app_thread主要线程外,我们可以看到还有BT跟audio一些线程,关于线程间的通信,以及BLE应用层处理的流程,今后再更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BES2300 代码主架构笔记 的相关文章

  • kafka入门案例

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 1228 Conumer demo1 java内容如下 package com lenovo kafka demo import org ap
  • QT 设置样式的两种方式

    1 通过直接加载样式表文件 若现为整个APP加载同一个样式表文件 可直接读取整个qss文件 然后QApplication 设置样式表的成员函数最终继承自父类QGuiApplication 的类对象执行a setStyleSheet cons

随机推荐

  • 星星之火-59:ETSI与FCC在5GHz非授权频谱LAA上要求的差异

    目录 1 ETSI与FCC概述 2 ETSI与FCC在5GHz非授权频谱的比较 2 1 频谱概述 2 2 可用信道数的差异 2 3 基站的发送功率的差异 2 3 雷达信号规范的差异 1 ETSI与FCC概述 ETSI 欧洲电信标准化协会 E
  • golang中的类型断言

    goLang有类型转换 类型断言 类型切换 1 接口类型断言 类型断言就是将接口类型的值 x 装换成类型 T 成功则返回 T 的实例 格式为 x T 不安全 会造成panic 程序中断 v x T 不安全 会造成panic 程序中断 v o
  • Java基础如何学扎实的经验之谈

    文章目录 一 知道Java学习的整体框架 Java基础 Java高级 JavaWeb 二 该怎么学习 入门工具 入门书籍推荐 三 怎么边学边敲代码 训练提示 解题方案 操作步骤 参考代码 四 记笔记的方法 五 其他 六 解决问题的能力 首先
  • java string 转小写_Java String toLowerCase()(String转小写)与示例 - Break易站

    Java 字符串 Java String toLowerCase String转小写 与示例 Java字符串toLowerCase 方法中的字符串的所有字符转换为小写字母 有两种类型的toLowerCase 方法 签名 public Str
  • 通俗讲解:什么是Web

    转自 微点阅读 https www weidianyuedu com content 1017370521955 html 简单的说Web就是为用户提供的一种在互联网上浏览信息的服务 Web服务是动态的 可交互的 跨平台的和图形化的 Web
  • vscode安装_VsCode安装shader glsl环境

    在扩展tab中搜索Shader languages support for VS Code sls for vs code插件 2 安装后搜索glsl canvas 并安装 glsl canvas插件 至此环境安装完成 可新建个工程测试 测
  • v-model cannot be used on v-for or v-slot scope variables because they are not writable报错问题解决方案

    报错 错误代码 div div
  • redis 集合排重_使用Redis的有序集合实现排行榜功能

    游戏中存在各种各样的排行榜 比如玩家的等级排名 分数排名等 玩家在排行榜中的名次是其实力的象征 位于榜单前列的玩家在虚拟世界中拥有无尚荣耀 所以名次也就成了核心玩家的追求目标 一个典型的游戏排行榜包括以下常见功能 能够记录每个玩家的分数 能
  • ros tf

    欢迎访问我的博客首页 tf 1 tf 命令行工具 1 1 发布 tf 1 2 查看 tf 2 参考 1 tf 命令行工具 1 1 发布 tf 我们根据 cartographer ros 的 launch 文件 backpack 2d lau
  • 【Python】《Python编程:从入门到实践 (第2版) 》笔记-Chapter2-变量和简单数据类型

    二 变量和简单数据类型 在程序中可随时修改变量的值 而Python将始终记录变量的最新值 message Hello Python world print message message Hello Python Crash Course
  • hashCode的性能优化

    本文主要讨论下不同的hashCode 实现对应用程序的性能影响 hashCode 方法的一个主要作用就是使得对象能够成为哈希表的key或者散列集的成员 但同时这个对象还得实现equals Object 方法 它和hashCode 的实现必须
  • visio图标_弱电间机柜原型图整理,可编辑!(Excel,visio,CAD)

    有朋友问到机柜原型图 这个我们在弱电vip技术群里面也有朋友提到过 今天我们就整理了弱电系统中常用的机柜原型图 有Excel visio CAD版本 可以修改编辑 1 Excel机柜原型图 可编辑 机柜布局 1 机柜布局 2 机柜布局 3
  • C++全局对象初始化依赖关系处理

    class A private int m nSize public A m nSize 100 m pList new char 4 memset m pList 0 sizeof 4 sizeof char int GetSize re
  • 使用基础粒子群(PSO)算法求解一元及二元方程的Python代码

    最近在看清风的数学建模视频 其中有两道题 求一元函数的最值问题 题目 求函数 y 11 s i n x
  • 小谈Intel SGX

    目录 Intel SGX简介 背景 为什么要Intel SGX Intel SGX尚处于学术讨论 Intel SGX和可信启动什么关系 开发者眼中SGX长什么样子 SGX访问控制是什么 MEE与SGX EPC内存加密 CPU里面SGX长什么
  • 深度学习笔记(一):环境(yolov5)配置

    前言 本文为笔者在学习深度学习 进行环境配置时集各家所长总结的一些经验 旨在能够较快的配置好深度学习所需的环境 一 软件安装 1 1 Anaconda安装 直接在官网下载 Anaconda官网链接 安装包下载完毕后 进行安装 更改安装路径
  • CSS属性纪要

    1 line height 行高 跟font size属性的大小有关 一般可用来设置元素垂直居中 1 单行文字或单张图片的垂直居中 div 你好你好 div 以以上代码为例 设置box和height和line height高度一样就可以垂直
  • 原子锁

    Windows核心编程 Interlocked原子访问系列函数 http blog csdn net zhongguoren666 article details 7542975 InterlockedExchange http blog
  • 时间序列的数据分析(一):主要成分

    时间序列是一组按照时间发生先后顺序进行排列 并且包含一些信息的数据点序列 在时间序列数据中通常包含了数据的发展趋势 向上 向下 保持 和数据的变化规律 季节性 等特征 而这些特征往往具有一定的规律性和可预测性 具体来说时间序列数据具有如下几
  • BES2300 代码主架构笔记

    1 BES的内核用的是RTX的内核 并且用了ARM推广的CMSIS RTOS API接口 这样做的好处是可以方便内核的更换 方便移植上层代码 2 程序是从RTX CM LIB H里面的 main init 开始的 里面包括了内核的初始化 堆