Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CACHE
ZYNQ7000
mo动态模块_Module
动态模块加载的调试经验
发布于 2021-03-25 14:05:08 浏览:1912
订阅该版
[tocm] # 动态模块加载的调试经验 ## 问题一 在调试基于 ZYNQ7000 的动态模块加载功能时,发现动态模块在加载到内存中后,去执行相关代码时,大概率系统会跑飞掉,有时会执行一些莫名其妙的指令,出现 undefined instruction 错误,或者是代码跑飞掉,pc 运行到一些神奇的地址,例如 0x00000004,这种位置,导致 data abort。 经过几轮调试,没有发现系统中有什么逻辑上的 bug,陷入僵局。后来经高手提示,检查在动态加载的过程中对 cache 是否进行了正确处理,这才找到问题所在。 如果在跳转到动态模块的入口地址运行程序前,没有对 cache 进行正确操作,那么很有可能加载的数据还在 cache 中,还没有被成功写入到内存中正确的位置,此时去运行该地址中的指令,则会发现,这些指令都是一些乱码,导致系统行为异常。 因此,在跳转到动态模块入口地址运行前,需要对 cache 执行如下操作: - `flush dcache` 将数据 cache 中的数据写入到内存中 - `invalid icache` 将指令 cache 中的数据无效化,重新读取后续要执行的指令 通过这两个操作,就可以保证我们加载的动态模块被实实在在地写入了内存中,无效指令cache,使得接下来 cpu 要执行的指令也确实是我们加载到内存中的,动态模块的指令。 ### 结论 发现数据异常,执行的相关指令为非常奇怪的指令时,可以查看相关内存,检查是否是由于 cache 没能同步导致的。 ## 问题二 目前动态模块加载功能还有如下待完善的地方: 1. 在初始化全局指针的时候,不能将其设置为某个全局变量的地址,因为全局变量的地址是在加载完成后才确定的(利用寄存器指定加载基地址加偏移量进行寻址),这种写法可能会导致初始化失败。 2. 动态模块中所有需要重定位的符号,都需要在加载的过程中就进行重定位,而没有进行延时加载(即第一次调用时去查找替换),又不可以利用系统调用,这就导致了加载速度较慢。 3. 使用动态模块加载时,如果发现有些符号在系统中找不到,在编译的过程中是不会提示错误的,只有在代码运行时,尝试查找相关符号时才会报错,这将加大调试难度。 ### 结论 使用微内核(通过设备访问驱动程序,通过系统调用与内核交互)可以解决这些问题,内核与应用就可以单独编译,并且不存在加载慢的问题。但是有些芯片可能没有附带 MMU,不是很方便使用微内核。 ## 问题三 在使用 `coremark` 进行动态模块性能测试时,运行时解析发现缺少 `__aeabi_uidiv` 符号,该符号是工具链 c 库函数中提供的。在代码中没有显式调用,在编译过程中,如果发现代码中进行了除法运算,则尝试使用工具链 C 库中提供的 `__aeabi_uidiv` 函数来完成,该调用过程满足 arm 过程调用标准。 解决这个问题有两种思路: - 第一种是将缺少的符号实现链接到动态模块上,但是这种方式目前无法实现,目前的编译方法(编译成 elf 共享库的方式),如果遇到这种符号的处理办法是,先不进行重定位,到加载运行时在进行重定位。 - 第二种思路是在内核中,将缺少的符号导出到动态模块查询的符号表中,理论上在实际内核中肯定是调用了这个符号的,但是因为没有使用 `RTM_EXPORT` 命令导出,所以在重定位时找不到相应的符号。添加该符号的方法如下所示: ``` extern __aeabi_uidiv; RTM_EXPORT(__aeabi_uidiv); ``` ### 结论 需要了解 elf 的不同格式以及加载方式,可以参考 ELF for the ARM® Architecture。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
我夏了夏天
Life isn't about finding yourself, life is about creating yourself.
文章
24
回答
1319
被采纳
20
关注TA
发私信
相关文章
1
貌似stm32f10x的应用模块在1.2.x版本不能正常编译
2
应用模块打开之后unload之后还在内存中
3
关于module.c的_load_shared_object的疑问
4
应用模块的rt_module_unload函数的bug
5
rtt 如何实现动态加载app
6
使用zmodem传输文件,应用模块文件传输完成,访问失败
7
RTT下应用模块编译具体方法
8
RTT应用模块编译出错
9
RTT应用模块编译问题
10
求问动态模块是什么意思呢
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
GD32
ADC
flashDB
编译报错
socket
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
出出啊
1520
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
550
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部