前言
前面准备了 rt-thread qemu mps2-an385 bsp 制作相关的环境与相关文件,本篇开始讲解 bsp 如何适配到 rt-thread
cpu 部分已经适配好了,也就是通过 使能 arch_arm_cortex_m3 ,来使能 rt-thread/libcpu/arm/cortex-m3,这部分不需要改动
定时器部分:systick 部分,这部分需要配置,mps2-an385 系统时钟应该是 25mhz
rt-thread 启动入口的执行, 在使用 gcc 时,入口函数为 :entry
mps2-an385 mcu 上电,第一次执行的是 reset_handler,可以查看 链接脚本 qemu-mps2-arm/drivers/cmsdk_cm3/source/gcc/gcc_arm.ld entry(reset_handler)
创建 main.c
创建 main.c,位置 qemu-mps2-arm/applications/main.c,可以其他的 bsp 复制一份,代码简单一点即可,注意把 构建脚本 sconscript 也复制一份过来
#include
int main(void)
{
rt_kprintf(hello rt-thread!n);
while (1)
{
rt_thread_mdelay(5000);
}
}
配置 vs code gdb 调试
使用 qemu 最方便 gdb 调试,使用 vs code,可以源码调试,非常的方便,同时利于 代码执行流程的梳理,问题的排查定位
在没有配置或者启动 rt-thread 前,在没有开启 uart 串口前,使用 gdb 调试,无疑是必要的。
qemu 正常启动脚本:qemu.sh chmod +x qemu.sh
qemu-system-arm --version
qemu-system-arm -m mps2-an385
-kernel rtthread.bin
-nographic
qemu 调试启动脚本:qemu-dbg.sh chmod +x qemu-dbg.sh
qemu-system-arm --version
qemu-system-arm -m mps2-an385
-kernel rtthread.bin
-nographic
-s -s
vs code debug 脚本: .vscode/launch.json,点击vs code 左栏 调试按钮,初次创建 launch.json
{
// use intellisense to learn about possible attributes.
// hover to view descriptions of existing attributes.
// for more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
version: 0.2.0,
configurations: [
{
name: launch qemu rtosdemo,
type: cppdbg,
request: launch,
program: ${workspacefolder}/qemu-mps2-arm/rtthread.elf,
cwd: ${workspacefolder},
midebuggerpath: /home/zhangsz/linux/tools/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin/arm-none-eabi-gdb,
midebuggerserveraddress: localhost:1234,
stopatentry: true,
}
]
}
初次调试 确认是否进入 reset_handler
运行 qemu-dbg.sh, 进入 qemu-mps2-arm 目录,先执行 ./qemu-dbg.sh,此时会 qemu 会卡住
点击 vs code 调试按钮,然后点击 开始调试按钮,【start debugging f5】,我的 vs code 不能直接点击 f5,这里使用鼠标点击 开始调试
如果正常进入 reset_handler,说明 启动脚本参与编译并工作了,接下来就需要对接 entry rt-thread 入口函数了
系统时钟 25mhz
reset_handler 是 程序的入口, 第一个执行的函数: systeminit,单步进入,这里可以获取到系统的时钟:system_clock 为 25mhz94b8b39.html
reset_handler 继续执行,复制 flash 中的 .text 段 到 sram,并且 清零 .bss,启动文件的一些符号,可以通过查看对比 链接脚本 获取到
【备注】这里 bl _start 应该直接进入 main 函数,由于 rt-thread 在 main 函数之前,做了初始操作,所以需要改为 rt-thread entry 入口函数
进入 rt-thread entry
reset_handler >> bl _start 改为 bl entry,这样调试发现进入了 rt-thread 的 entry 入口,开始 rt-thread 系统初始化
rt-thread 自动初始化等预留的符号
rt-thread 自动初始化、msh shell 等符号,在使用 gcc 编译工具链时,需要在 链接脚本中预留,否则 rt-thread 自动初始化失效、msh shell cmd 也不能正常的使用
修改链接文件 qemu-mps2-arm/link.lds,在 .text 段,增加
/* section information for finsh shell /
. = align(4);
__fsymtab_start = .;
keep( (fsymtab))
__fsymtab_end = .;
. = align(4);
__vsymtab_start = .;
keep((vsymtab))
__vsymtab_end = .;
/ section information for initial. /
. = align(4);
__rt_init_start = .;
keep( (sort(.rti_fn*)))
__rt_init_end = .;
待续: 接下来开启 rt-thread 系统 tick 定时器,适配 uart 串口,让 rt-thread 运行起来
小结
本篇主要通过 vs code gdb 的方式,调试入口函数的执行,通过修改入口函数 _start,执行 rt-thread 入口函数 entry,从而进入 rt-thread 世界
由于没有 tick 定时器、串口打印,所以需要进一步完善设备驱动
注意连接脚本:需要为 rt-thread 自动初始化、msh shell cmd 等预留 符号在 .text 段
工厂有多台PLC时,不同网段之间如何实现相互访问
通过远程传感器的太阳能遥感器设计
DIALOG 数据记录仪配置工具及数据分析软件
安科瑞充电桩收费运营云平台解决方案
基于RASC的keil电子时钟制作(瑞萨RA)(10)----读取DHT11温湿度数据
请教一下bsp如何适配到RT-Thread上呢?
深圳 5G 产业协会推动前瞻汽车技术商用落地
松下将进一步提升超级工厂产能,电池产量可到54 GWh
如何利用大规模语言模型将自然语言问题转化为SQL语句?
海伯森3D闪测传感器斩获创新产品金奖
京东官微宣布:OPPO Find X6月29日开启预约,不过并未公布该机的售价
美高森美和Tamba合作开发新型PolarFire器件 提供基于低功耗FPGA的业界领先10G以太网解决方案
法国游客缅甸飞无人机被监禁 美国雷神开发新型反无人机系统
华为在中国卖出了苹果全球的量 份额增加了15%之多
Linear推出低噪声、高精度CMOS运算放大器-LTC6244
2018年上半年中国公有云SaaS市场平稳增长
中国石油深圳新能源研究院与华为数字能源签署战略合作协议
中兴BladeV10获工信部入网许可 采用6.3英寸水滴屏支持背部指纹识别预计售价在千元左右
怎样用CD4033制作数字秒表
虹科3D固态激光雷推动自动驾驶快速发展