Uboot调用库函数memset程序跑飞,贴出反汇编代码

隔夜月 2013-03-28 12:57:53
我在移植Uboot的时候,在uboot stage 2 发现代码在调用memset库函数的时候就跑飞了,很郁闷,我之后用点灯和反汇编来看,但是没看出问题,我把代码贴出来给大家看看,看哪里出了问题。我用两次点灯来定位问题,发现点灯1操作能正常,点灯2就不正常了,断定memset没有调用成功。不知道哪里出了问题,大家帮忙看看,谢谢了啊

C 代码:

/* ----------- Leds test chen ----------------------*/
(*((volatile unsigned int *)0x7F008820)) = 0x0110; //点灯1
(*((volatile unsigned int *)0x7F008824)) = 0x0;

memset ((void*)gd, 0, sizeof (gd_t)); //这里有问题

while (1);
/* -------------------------------- ----------------------*/

void * memset(void * s,int c,size_t count)
{

(*((volatile unsigned int *)0x7F008820)) = 0x1001; //点灯2
(*((volatile unsigned int *)0x7F008824)) = 0x0;

unsigned long *sl = (unsigned long *) s;
unsigned long cl = 0;
char *s8;
int i;

/* do it one word at a time (32 bits or 64 bits) while possible */
if ( ((ulong)s & (sizeof(*sl) - 1)) == 0) {
for (i = 0; i < sizeof(*sl); i++) {
cl <<= 8;
cl |= c & 0xff;
}
while (count >= sizeof(*sl)) {
*sl++ = cl;
count -= sizeof(*sl);
}
}
/* fill 8 bits at a time */
s8 = (char *)sl;
while (count--)
*s8++ = c;

return s;
}


反汇编代码:
57e00808 <start_armboot>:
57e00808: e59f3034 ldr r3, [pc, #52] ; 57e00844 <start_armboot+0x3c> //点灯1相关指令
57e0080c: e92d4010 push {r4, lr}
57e00810: e5933000 ldr r3, [r3] //点灯1相关指令
57e00814: e2438941 sub r8, r3, #1064960 ; 0x104000
57e00818: e2488020 sub r8, r8, #32 ; 0x20
57e0081c: e59fe024 ldr lr, [pc, #36] ; 57e00848 <start_armboot+0x40>
57e00820: e3a0c000 mov ip, #0 ; 0x0
57e00824: e3a03e11 mov r3, #272 ; 0x110 //点灯1相关指令
57e00828: e58e3820 str r3, [lr, #2080] //点灯1相关指令
57e0082c: e1a0100c mov r1, ip
57e00830: e1a00008 mov r0, r8
57e00834: e3a02020 mov r2, #32 ; 0x20
57e00838: e58ec824 str ip, [lr, #2084] //点灯1相关指令
57e0083c: eb004628 bl 57e120e4 <memset> //跳转memset执行
57e00840: eafffffe b 57e00840 <start_armboot+0x38>
57e00844: 57e00048 .word 0x57e00048
57e00848: 7f008000 .word 0x7f008000


57e120e4 <memset>:
57e120e4: e59f3088 ldr r3, [pc, #136] ; 57e12174 <memset+0x90> //点灯2相关指令
57e120e8: e92d4010 push {r4, lr}
57e120ec: e210c003 ands ip, r0, #3 ; 0x3
57e120f0: e1a04000 mov r4, r0
57e120f4: e59f007c ldr r0, [pc, #124] ; 57e12178 <memset+0x94> //点灯2相关指令
57e120f8: e5830820 str r0, [r3, #2080] //点灯2相关指令
57e120fc: e3a00000 mov r0, #0 ; 0x0
57e12100: e5830824 str r0, [r3, #2084] //点灯2相关指令
57e12104: e1a00004 mov r0, r4
57e12108: 1a000010 bne 57e12150 <memset+0x6c>
57e1210c: e1a0000c mov r0, ip
57e12110: e2800001 add r0, r0, #1 ; 0x1
57e12114: e20130ff and r3, r1, #255 ; 0xff
57e12118: e3500004 cmp r0, #4 ; 0x4
57e1211c: e183c40c orr ip, r3, ip, lsl #8
57e12120: 1afffffa bne 57e12110 <memset+0x2c>
57e12124: e1a00002 mov r0, r2
57e12128: e3a03000 mov r3, #0 ; 0x0
57e1212c: ea000001 b 57e12138 <memset+0x54>
57e12130: e784c003 str ip, [r4, r3]
57e12134: e2833004 add r3, r3, #4 ; 0x4
57e12138: e3500003 cmp r0, #3 ; 0x3
57e1213c: e2400004 sub r0, r0, #4 ; 0x4
57e12140: 8afffffa bhi 57e12130 <memset+0x4c>
57e12144: e3c23003 bic r3, r2, #3 ; 0x3
57e12148: e0840003 add r0, r4, r3
57e1214c: e2022003 and r2, r2, #3 ; 0x3
57e12150: e3a03000 mov r3, #0 ; 0x0
57e12154: ea000001 b 57e12160 <memset+0x7c>
57e12158: e7c01003 strb r1, [r0, r3]
57e1215c: e2833001 add r3, r3, #1 ; 0x1
57e12160: e3520000 cmp r2, #0 ; 0x0
57e12164: e2422001 sub r2, r2, #1 ; 0x1
57e12168: 1afffffa bne 57e12158 <memset+0x74>
57e1216c: e1a00004 mov r0, r4
57e12170: e8bd8010 pop {r4, pc}
57e12174: 7f008000 .word 0x7f008000
57e12178: 00001001 .word 0x00001001
...全文
393 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
隔夜月 2013-03-28
  • 打赏
  • 举报
回复
Hony杨 2013-03-28
  • 打赏
  • 举报
回复
个人觉得你点灯调试有问题,既然是C库的memset,你应该在该函数前后打印夹击它即可看出问题。
内容概要:本文围绕超导磁能储存系统(SMES)的建模与仿真展开,基于Simulink平台构建系统级动态仿真模型,涵盖超导线圈、功率转换系统(PCS)以及核心控制策略等关键模块。研究重点在于分析SMES在电网中实现快速能量存储与释放的能力,验证其在提升电力系统稳定性、抑制功率波动方面的有效性,尤其针对新能源发电带来的间歇性与波动性问题提供了有效的解决方案。通过仿真手段深入探讨系统的动态响应特性,为优化控制算法的设计与应用提供可靠的技术支撑。; 适合人群:适用于具备电力系统、自动控制理论或能源存储技术背景,熟悉Simulink仿真环境的科研人员、工程技术人员及研究生;同时适合有志于开展新型储能技术仿真研究的高年级本科生参考学习。; 使用场景及目标:①深入理解超导磁能储存系统的基本结构、工作原理及其在电力系统中的应用场景;②掌握在Simulink中搭建复杂电力电子与控制系统联合仿真模型的方法;③研究SMES在电网调频、电压支撑、瞬时功率补偿等典型工况下的动态性能表现;④为后续先进控制策略(如PID、模糊控制、现代控制理论等)的优化设计与验证提供仿真试验平台。; 阅读建议:建议读者结合文中模型逐步动手搭建仿真系统,重点关注各功能模块的参数设置与信号接口匹配,配合具体案例进行仿真调试,深入理解控制逻辑与系统动态行为之间的内在联系,并可进一步拓展至与其他储能形式(如锂电池、轮储能)的性能对比研究,以深化对不同类型储能技术特点的认知。
内容概要:本文围绕“考虑火-储联合调频(火电机组-混合储能)的协同控制策略”展开研究,提出一种基于Matlab仿真的协同控制方法,旨在提升电力系统频率调节的快速性与稳定性。通过构建火电机组与混合储能(如蓄电池、轮等)的联合调频模型,设计合理的功率分配机制与控制策略,充分发挥火电的持续调节能力与储能的快速响应优势,有效应对电网负荷波动与频率偏差。文中结合改进信号分解算法(如ICEEMDAN)与优化算法(如GWO),实现对调频信号的精准分频与储能单元的优化调度,提高系统整体调频效率与经济性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事新能源并网、电力系统稳定控制、储能技术应用等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于研究火电机组与混合储能在电网一次调频、二次调频中的协同作用机制;②为实际电力系统中储能配置与调频控制策略设计提供仿真验证平台与理论支持;③支撑相关课题研究、学术论文撰写及工程项目前期论证。; 阅读建议:建议结合Matlab代码深入理解控制算法实现细节,重点关注功率分配逻辑、信号分解过程与优化算法参数设置,并可通过修改系统参数进行对比仿真,以加深对协同控制效果的认识。

21,620

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧