Compare commits
4
Commits
28edb68744
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d2df940aa6 | ||
|
|
8fb76e1318 | ||
|
|
6c1e790cd1 | ||
|
|
f0e850bf7f |
@@ -178,13 +178,13 @@ $(BUILD_DIR)/$(SUB_DIR_DEBUG): | $(BUILD_DIR)
|
|||||||
# Release 最终可执行文件编译任务
|
# Release 最终可执行文件编译任务
|
||||||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe: $(RELEASE_OBJECTS)
|
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe: $(RELEASE_OBJECTS)
|
||||||
@echo ====== [Release] All File Compiled. Now Linking... ======
|
@echo ====== [Release] All File Compiled. Now Linking... ======
|
||||||
$(C++_COMPLIER) $(RELEASE_OBJECTS) -o $@ $(LIB_LINK) $(LDFLAGS)
|
$(C++_COMPLIER) $(RELEASE_OBJECTS) -static -o $@ $(LIB_LINK) $(LDFLAGS)
|
||||||
@echo ====== [Release] Program Link Finished ======
|
@echo ====== [Release] Program Link Finished ======
|
||||||
|
|
||||||
# Debug 最终可执行文件编译任务
|
# Debug 最终可执行文件编译任务
|
||||||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe: $(DEBUG_OBJECTS)
|
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe: $(DEBUG_OBJECTS)
|
||||||
@echo ====== [Debug] All File Compiled. Now Linking... ======
|
@echo ====== [Debug] All File Compiled. Now Linking... ======
|
||||||
$(C++_COMPLIER) $(DEBUG_OBJECTS) -o $@ $(LIB_LINK) $(LDFLAGS)
|
$(C++_COMPLIER) $(DEBUG_OBJECTS) -static -o $@ $(LIB_LINK) $(LDFLAGS)
|
||||||
@echo ====== [Debug] Program Link Finished ======
|
@echo ====== [Debug] Program Link Finished ======
|
||||||
|
|
||||||
# C Release 目标文件编译
|
# C Release 目标文件编译
|
||||||
@@ -219,5 +219,5 @@ $(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.rc Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG)
|
|||||||
|
|
||||||
|
|
||||||
# 依赖关系
|
# 依赖关系
|
||||||
-include $(wildcard $(BUILD_DIR)/$(SUB_DIR_RELEASE)*.d)
|
-include $(RELEASE_OBJECTS:.o=.d)
|
||||||
-include $(wildcard $(BUILD_DIR)/$(SUB_DIR_DEBUG)*.d)
|
-include $(DEBUG_OBJECTS:.o=.d)
|
||||||
@@ -13,7 +13,10 @@
|
|||||||
|
|
||||||
工具支持结构体类型解析(内嵌结构体成员的结构体除外)、地址匹配、4字节地址对齐、常量宏定义识别、记录布局补全;
|
工具支持结构体类型解析(内嵌结构体成员的结构体除外)、地址匹配、4字节地址对齐、常量宏定义识别、记录布局补全;
|
||||||
## 如何使用
|
## 如何使用
|
||||||
首先需要进行一些准备,工具需要知道你要将哪些内容生成为标定量,哪些内容生成为观测量,为此你需要按照如下示例将特定的标记段插入原始代码中:
|
|
||||||
|
你可以在仓库的Release处找到已经预构建好的可执行文件,也可以自行构建;
|
||||||
|
|
||||||
|
工具需要知道你要将哪些内容生成为标定量,哪些内容生成为观测量,为此你需要按照如下示例将特定的标记段插入原始代码中:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// .\Test\source_code.c
|
// .\Test\source_code.c
|
||||||
@@ -57,20 +60,20 @@ SrcToA2L.exe .\Test\typedef.h .\Test\source_code.c
|
|||||||
|
|
||||||
- `-r` 指定为合并写入的参考A2L文件;
|
- `-r` 指定为合并写入的参考A2L文件;
|
||||||
- `-m` 指定为用于查找地址的map文件;
|
- `-m` 指定为用于查找地址的map文件;
|
||||||
- `-a` 指定字节对齐长度(仅非0数值且为2的正整次幂),不指定或参数错误时默认为4字节对齐;
|
- `-a` 指定字节对齐长度(仅为1或2的正整次幂),不指定或参数错误时默认为4字节对齐;
|
||||||
|
|
||||||
其它传入的参数视为用于解析的源文件、头文件,A2L与map文件仅传入的最后一个有效;
|
其它传入的参数视为用于解析的源文件、头文件,A2L与map文件仅传入的最后一个有效;
|
||||||
|
|
||||||
**`SrcToA2L` 不会破坏任何用于输入的文件,仅以只读模式打开**;
|
**`SrcToA2L` 不会破坏任何用于输入的文件,仅以只读模式打开**;
|
||||||
|
|
||||||
## 注意事项
|
## 注意事项
|
||||||
本工具为了省略多余操作,除需特定处理的 `calibrations` 与 `measurements` 标记段外,结构体、宏定义、地址匹配等的解析识别是通过全文扫描提取关键字进行的,由于代码风格千奇百怪,解析处理过程有可能会遇到预料之外的BUG(尤其是在生产环境下),为避免发生此类情况发生,最好事先将用于处理的代码进行格式化,或特别留意 `define`、`typedef` 等关键字周边的情况;
|
本工具为了省略多余操作,除需特定处理的 `calibrations` 与 `measurements` 标记段外,结构体、宏定义、地址匹配等的解析识别是通过全文扫描提取关键字进行的,由于代码风格千奇百怪,解析处理过程有可能会遇到预料之外的BUG(尤其是在生产环境下),为避免发生此类情况发生,**最好事先将用于处理的代码进行格式化**,或特别留意 `define`、`typedef` 等关键字周边的情况;
|
||||||
|
|
||||||
如有意外情况发生,可以参考终端日志查看问题发生位置以修改输入文件,或对本工具源码进行修改,构建适应特定环境的版本;
|
如有意外情况发生,可以参考终端日志查看问题发生位置以修改输入文件,或对本工具源码进行修改,构建适应特定环境的版本;
|
||||||
|
|
||||||
此外,由于嵌入式平台对类型长度敏感,**本工具仅支持部分`stdint.h`中字节长度固定的标准类型,并将部分常用类型解析为固定长度**,如下所示:
|
此外,由于嵌入式平台对类型长度敏感,**本工具仅支持部分`stdint.h`中字节长度固定的标准类型,并将部分常用类型解析为固定长度**,如下所示:
|
||||||
```c++
|
```c++
|
||||||
// Src/Tool_Functions.cpp
|
// .\Inc\Type_Descriptions.hpp
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@@ -90,7 +93,7 @@ typedef enum
|
|||||||
|
|
||||||
类型匹配详情可以在以下函数中查看,你也可以修改这个函数以支持更多的类型:
|
类型匹配详情可以在以下函数中查看,你也可以修改这个函数以支持更多的类型:
|
||||||
```c++
|
```c++
|
||||||
// Src/Tool_Functions.cpp
|
// .\Src\Tool_Functions.cpp
|
||||||
|
|
||||||
// 解析变量类型
|
// 解析变量类型
|
||||||
variable_type_enum solve_variable_type(const char *type_str)...
|
variable_type_enum solve_variable_type(const char *type_str)...
|
||||||
@@ -103,15 +106,15 @@ variable_type_enum solve_variable_type(const char *type_str)...
|
|||||||
#define VALUE_3 VALUE_1 // X
|
#define VALUE_3 VALUE_1 // X
|
||||||
```
|
```
|
||||||
## 关于构建
|
## 关于构建
|
||||||
本仓库所使用的构建环境为:
|
本仓库所使用的构建平台及环境为如下:
|
||||||
[mingw-w64\i686-14.2.0-release-win32-dwarf-ucrt-rt_v12-rev2](https://github.com/niXman/mingw-builds-binaries/releases/tag/14.2.0-rt_v12-rev2)
|
OS:Windows11 Professional 24H2 (26100.4652)
|
||||||
|
Tool Chain:[mingw-w64\i686-14.2.0-release-win32-dwarf-ucrt-rt_v12-rev2](https://github.com/niXman/mingw-builds-binaries/releases/tag/14.2.0-rt_v12-rev2)
|
||||||
|
|
||||||
构建关系由 `Makefile` 组织,使用 `C17`、`C++17` 标准,但由于并未使用高级特性,构建标准可自行调整(按理说 `C98`、`C++98` 应该也行);
|
构建关系由 `Makefile` 组织,使用 `C17`、`C++17` 标准,但由于并未使用高级特性,构建标准可自行调整(按理说 `C98`、`C++98` 应该也行);
|
||||||
|
|
||||||
完善构建环境后,在工作目录下使用 `make`、`mingw32-make` 即可进行构建;
|
完善构建环境后,在工作目录下使用 `make`、`mingw32-make` 即可进行构建;
|
||||||
|
|
||||||
**Linux环境下也可以进行构建,但需要对 `Makefile` 进行少量修改**;
|
本工具仅使用标准库,完全具备跨平台支持,但在其他平台、环境下需要对 `Makefile` 进行少量修改;
|
||||||
|
目前已知使用64位或某些分发版本的编译器时会出现 `size_t` 类型不统一导致的编译警告,但不影响主要功能;
|
||||||
## 主要目录及说明
|
## 主要目录及说明
|
||||||
Git-Storage 本仓库目录
|
Git-Storage 本仓库目录
|
||||||
├─.vscode 用于vscode的配置文件
|
├─.vscode 用于vscode的配置文件
|
||||||
|
|||||||
@@ -36,7 +36,9 @@ void solve_args(int argc, char *argv[])
|
|||||||
|
|
||||||
size_t value = 0;
|
size_t value = 0;
|
||||||
sscanf(argv[count + 1], "%u", &value);
|
sscanf(argv[count + 1], "%u", &value);
|
||||||
if ((value % 2 == 0 && value != 0) || value == 1)
|
|
||||||
|
// 利用2进制中2的整次幂仅有1位为1判定是否为合法字节对齐
|
||||||
|
if ((value & (value - 1)) == 0 && value != 0)
|
||||||
{
|
{
|
||||||
log_printf(LOG_SUCCESS, "Alignment size set to %u.", value);
|
log_printf(LOG_SUCCESS, "Alignment size set to %u.", value);
|
||||||
addr_alignment_size = value;
|
addr_alignment_size = value;
|
||||||
|
|||||||
Reference in New Issue
Block a user