GNU Linker Script

Reference 官方文档: https://sourceware.org/binutils/docs/ld.pdf 2. Invocation 讲了 command line ld 的各种选项。 3. Linker Script 3.1 Basic Linker Script Concepts loadable section and allocatable section A section may be marked as loadable, which means that the contents should be loaded into memory when the output file is run. A section with no contents may be allocatable, which means that an area in memory should be set aside, but nothing in particular should be loaded there (in some cases this memory must be zeroed out)....

2024-11-12 · 3 min

Keil相关内存设置

内存设置 off-chip和on-chip本质上没有区别,只是地址会不同。 假如ic都是on-chip sram,要分成三块的话,把一块写到off-chip就可以。 NoInit不勾选的话,每次进main函数前会对该memory进行清0的操作。 前面default是默认的变量保存地址。 修改变量地址 可以直接在keil左侧对文件右击,选择第一个option for file,对该文件中的变量地址进行修改。 Code/Const会保存到default的ROM中。 Zero initialized Data是bss段数据(未初始化的和初始化为0的全局变量,函数中的static变量)。 Other data是data段数据(初始化为非0的全局变量,函数中的static变量)。 对启动文件中的zero initialized data修改位置,将会更改栈和堆的地址。 还可以直接在code中修改某个变量的地址: sdcp_keypair g_tFWKey __attribute__((section(".ARM.__at_0x20000000")));

2024-06-21 · 1 min

Vscode备忘录

keybindings.json: 键盘快捷方式 json 文件。 setting.json: vscode 设置文件。 块选择:shift+箭头 / shift+Alt+鼠标 增加光标:Ctrl+Alt+上/下箭头 / Alt+click 复制一行:Shift+Alt+上/下箭头 移动一行:Alt+箭头 删除一行:Ctrl+Shift+K F2 可以代码重构,对 project 下所有的函数名替换名称 格式化文档:Shift+Alt+F 格式化整个文档 / Ctrl+K → Ctrl+F 格式化某一行 Ctrl+Shift+[ / Ctrl+Shift+] 折叠函数 alt + <n> 切换标签页 自定义的一些快捷键 在 vscode 键盘快捷方式中自定义的一些快捷键: alt + ↑/↓:调整终端大小。 Clangd 插件 配置 .clang-format 配置 compile_commands.json clangd 默认会在 project 目录下寻找compile_commands.json,如果compile_commands.json在 project 目录之外,那么需要通过在settings.json中指定clangd.arguments->--compile-commands-dir=xxx中compile_commands.json的位置。 settings.json: { "[c]": { "editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd" }, "[cpp]": { "editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd" }, "clangd.arguments": [ "--log=error", "--header-insertion=never", // 是否需要自动插入头文件 "--compile-commands-dir=....

2024-01-23 · 2 min

如何避免.bss变量转化成.data段变量

发现在一个.c文件中有一个初始化为非0的全局变量或静态变量,会使这整个文件中定义的全局变量或静态变量都由.bss段转化为.data段。 .data段的变量会在mcu boot阶段的clib会对这些变量做初始化,.bss段可以透过keilc的config如下图控制是否要跳过clib的初始化为0(目前我们的配置是把IRAM配置为不要初始化) 这样的话,我们的芯片在suspend或sleep之后,由于MCU做了power gating,resume起来后MCU重新上电,会重新从MCU boot那边开始跑,.data段的变量就无法保持suspend或sleep之前的值了,又被初始化成定义时候的值了,而.bss段就不会被初始化,可以保持之前的值。 在我们目前usb产品的应用中,一般变量都是要保持suspend/sleep之前的值,所以不能产生有.data段的变量 为了不产生.data段变量,我们要注意: - 全局变量在定义的时候不能做初始化。 - 不要使用静态的局部变量。 //错误示例: U8 g_byGlobalVar = 5; //正确示例: U8 g_byGlobalVar; void InitGlobalVars(void) { if(reset_status==RESET_FROM_POWER_ON) g_byGlobalVar=5; //InitGlobalVars()函数中做初始化 }

2023-09-06 · 1 min

U-Boot启动流程

Uboot编译流程 https://blog.csdn.net/ooonebook/article/details/53000893 编译生成的文件: 具体可以参考Uboot Makefile u-boot Makefile u-boot.cfg: $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.autoconf $(@) cfg: u-boot.cfg prepare2: prepare3 outputmakefile cfg prepare1: prepare2$(version_h) $(timestamp_h) $(dt_h) $(env_h) include/config/auto.conf archprepare: prepare1 scripts_basic prepare0: archprepare prepare:prepare0 scripts: scripts_basic scripts_dtc include/config/auto.conf $(u-boot-dirs): prepare scripts $(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) u-boot-init := $(head-y) u-boot-main := $(libs-y) u-boot-keep-syms-lto := keep-syms-lto.o u-boot.lds: $(LDSCRIPT) prepare u-boot: $(u-boot-init) $(u-boot-main) $(u-boot-keep-syms-lto) u-boot.lds u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb u-boot-nodtb.bin: u-boot dts/dt.dtb: u-boot u-boot.srec: u-boot u-boot.bin: u-boot-dtb.bin u-boot.sym: u-boot System....

2023-04-19 · 4 min