交流道岔表示电压采集模块程序阅读笔记
重要的变量、数据结构及功能函数1. 变量
变量名
变量类型
存储区域
作用
eLedState
enmLSType
全局变量
记录 LED 及数码管的当前状态
ledsta
uint32
静态局部变量
奇数: 开对应的 CAN 收发灯偶数: 关所有的 CAN 收发灯
CanLedStatus
uint8
静态局部变量
开灯时具体开哪些 CAN 收发灯
uDispPos
uint8
静态局部变量
0: 显示个位1: 显示十位
LedTimer
uint32
静态局部变量
LED 状态设置时复位,似乎后面没有定时应用
eBoardState
_BOARD_STATE
全局变量
记录模块的当前工作状态
Flash_Data
uint8[1024]
全局变量
无 Bootloader: 从最后扇区(0x0f)读取配置信息有 Bootloader: 从 Bootloader 的最后一个扇区(0x05)读取配置信息
__Cfg
Cfg_t
全局变量
模块配置信息
__DefCfg
Cfg_t
全局常量
模块默认配置信息
__DaqCanIf
canif ...
mOTA源码阅读笔记
先调用初始化函数,分别对数据传输,传输协议,固件管理进行初始化
示例配置为 3 分区方案(APP + download + factory)
将片内 512K 的 Flash 划出 4 个 32K 的分区来,分别对应 Bootload,APP,download,factory
上电先检查标志位,如果标志为没有设为更新固件或恢复出厂。则将 Bootloader 执行流程设为查找固件并运行
flowchart LR
app{"校检\nAPP区"} --> |Y| sp{应用程序SP\n是否指向\n片内RAM}
sp -->|Y| ok(FM_ERR_OK); sp-->|N| err(FM_ERR_JUMP_TO_APP_ERR);
app -->|N| fpk{检验\n下载区或\n恢复区}
fpk -->|Y| check{"是否以\nfpk开头"} -->|Y| ok
check -->|N| err
fpk -->|N| err
flowchart LR
id{"更新方式\n将Version信息\n写入APP区"}
old_version("从APP区末尾的读取FPK信息\n ...
Embedded Studio创建用keil ARMCC编译的工程
Embedded Studio本身有直接导入Keil工程文件的功能,导入也很方便。但今天我们试直接创建一个用ARMCC来编译的Embedded Studio工程文件。
Embedded Studio工程文件结构一个.emProject文件包含一个解决方案,每个解决方案可以包含多个工程和多个配置。每个工程又包含多个配置,工程中的配置是可以继承解决方案中的同名配置的。
创建一个新工程点击 File>>New Project...,选择将工程添加到一个新的解决方案中,还是添加到当前解决方案中。我们这儿选择创建一个全新的解决方案。
选择外部编译可执行文件,设置好工程名及存储路径。点击Next后选择目标设备及调试接口以及默认创建的配置文件即可。
默认创建了一个Debug配置文件和一个隐藏的common配置。
123456789101112131415161718192021222324<!DOCTYPE CrossStudio_Project_File><solution Name="LPC1752" target="8 ...
cmake学习与实践
根据下面的文档学习cmake的使用
文档对应的实例源码:点击下载
wxWidgets事件表
事件处理过程每一个wxEvtHandler的派生类,如frame,button,…等,都会在其内部维护一事件表,用来告诉wxWidgets事件和事件处理过程的对应关系。所有继承自wxWindow的窗口类,以及应用程类都是wxEvtHandler的派生类。
在wxWdigets中实现事件表,有以下3种方式:
通过DECLARE_EVENT_TABLE和BEGIN_EVENT_TABLE,END_EVENT_TABLE实现事件表
通过wxEvtHandler的Bind实现事件表
通过wxEvtHandler的Connect动态实现事件表
静态事件表要创建一个静态事件表(意味着它在编译期间创建的),你需要下面几个步骤:
定义一个直接或者间接继承自wxEvtHandler的类
为每一个你想要处理的事件定义一个处理函数
在这个类中使用DECLARE_EVENT_TABLE声明事件
在.cpp文件中使用BEGIN_EVENT_TABLE和END_EVENT_TABLE实现一个事件表
在事件表的实现中增加事件宏,来实现从事件到事件处理的映射
所有的事件处理函数拥有相同的形式:
返回值为vo ...
用Make编译wxWidgets简单程序
前些天试着用vscode来编写和编译wxwidgets程序,当程序只有单个源文件时该方法还是可以的。但如果一个工程有多个源文件需要编译后再链接成一个应用程序时,该方法就不哪么方便了。
必须单个选中每个源文件后运行编译任务,将源文件编译成.o文件
再创建链接任务,将生成的.o文件链接成一个应用程序
所以决定通过Makefile来组织编译工程文件。
wxWidgets.mk
wxWidgets.mk
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647# 指定wxWidgets的根目录wxWidgets_root_dir := D:/wxWidgets_3.1.5# 指定wxWidgets库文件的目录名wxWidgets_dll_dir_name := gcc810_dll# 指定编译debug版还是release版, [debug, release]# build_config ?= release# 指定wxWidgets库文件的编译类型: [msvc,gcc]类 ...
wxWidgets源码中samples的使用
参考window下如何搭建基于MinGw的wxWidgets开发环境中的“软件包安装”章节,在本地搭建好开发环境。这里我们还添加了了一个系统环境变量:WXWIN=D:\wxWidgets_3.1.5
源代码下载我们只需要从wxwidgets源码中克隆”samples/“和”build/msw”两个文件夹下的文件即可,具体操作如下:
sparsecheckout.sh1234567891011121314151617181920212223242526272829303132# !/usr/bin/bash# 引入配置文件# source config.sh# 配置远程仓库地址remote_repository='https://github.com/wxWidgets/wxWidgets.git'# 配置需要检出的目录或文件,用空格分隔。注:“=”两边不能有空格sparse_checkout_directory='samples build/msw'# 配置检出到本地的目录local_root='wxWid ...
Makefile学习
make命令执行时,需要一个Makefile文件,以告诉make命令需要怎么去编译和链接程序。
Makefile中规则的定义一个Makefile通常由一条或若干条规则组成,每条规则格式通常如下:
123target … : prerequisites … recipe …
target: 通常是文件名或要执行的动作名
单个文件
多个文件,使用空格分隔
使用通配符,表示多个文件名
压缩包中的文件: archive(member)
要执行的动作名,参见:伪目录
prerequisites: 通常是目录文件所依赖的文件
可以为空,表示目录不依赖任何文件
多个文件使用空格分隔,当一行太长时可以使用 \ 分割成多行写
也可以使用通配符,表示多个文件
也可是压缩包中的文件
recipe: 通常是产生目标文件或执行动作名,所执行的具体命令
每条命令必须: 以 Tab 开头,或以 .RECIPEPREFIX中设置的值开头
可以一条命令写一行,也可以多条命令写在同一行。当多条命令写在同一行时需用 ; 分隔每条命令。有时命令写在同一行和写在多行特殊情况下的差异
...
Vscode编写wxWidgets的HelloWorld
软件及资源包
下载并安装Vscode代码编辑器软件安装后还需在vscode的插件管理中安装C/C++开发插件
下载并安装MinGW-w64Windows下的GNU编译器下载编译器的版一定跟后面下载的wxWidgets的软件包编译使用的版本保持一致
从wxWidgets下载下图几压缩包
资源包截图
Header Files是wxWidgets的头文件,Development Files是编译所需的一些库文件件和动态库,Release DLLs是编译后的软件,发布给用户时需一起打包发送。不然用户有可能会报缺少dll文件的错误
软件包安装wxWidgets安装将上面下载的wxWidgets头文件和开发包,都解压到同一个文件夹下(这里我们以D:\wxWidgets_3.1.5为例)。解压后目录结构如下:
12345678wxWidgets_3.1.5/├── include │ ├── msvc <---> vc用的头文件我们用MinGW不用该目录│ └── wx└── lib └── gcc810_dll ├── mswu ...