Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
keil_MDK
Start_rvds.s 一点修改
发布于 2009-12-28 16:26:31 浏览:3693
订阅该版
在sam7x的启动代码里面我看到开了三个栈,svc irq 和usr,各256字节。但是在最后的这里有个问题,红色的字是被注掉了,原先这里要进入usr模式设置sp寄存器的,现在停留在svc模式,但是下面的sp设置却保留了,也就是说设置了两次svc的sp,后一次指向usr模式栈地址。简单的看来就是浪费掉256bytes,其实仔细想想这里应该是不需要给usr模式设置栈地址的。 ``` ; Enter Supervisor Mode and set its Stack Pointer MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #SVC_Stack_Size ; Enter User Mode and set its Stack Pointer ; MSR CPSR_c, #Mode_USR IF [s:154]EF:__MICROLIB EXPORT __initial_sp ELSE MOV SP, R0 SUB SL, SP, #USR_Stack_Size ENDIF ``` 单这边修改还不够,下面的__user_initial_stackheap 段代码也要做对应修改,否则在__main里面还会把地址置回去。 ``` __user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + USR_Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ENDIF ``` 题外话 我跟踪到`__main`的`__user_setup_stackheap`函数发现其中有个奇怪的地方,拿出来讨论一下 这个函数地址在这里,是个库函数 ``` __user_setup_stackheap 0x00103d34 ARM Code 96 sys_stackheap_outer.o(.text) ``` 找不到代码,只好跟踪汇编 ``` __user_setup_stackheap: 0x00103D34 E1A0500E MOV R5,R14 0x00103D38 EB000018 BL 0x00103DA0 0x00103D3C E1A0E005 MOV R14,R5 0x00103D40 E1B05000 MOVS R5,R0 0x00103D44 E1A0100D MOV R1,R13 0x00103D48 E1A0300A MOV R3,R10 0x00103D4C E3C00007 BIC R0,R0,#0x00000007 0x00103D50 E1A0D000 MOV R13,R0 0x00103D54 E28DD060 ADD R13,R13,#0x00000060 0x00103D58 E92D4020 STMDB R13!,{R5,R14} 0x00103D5C EBFFFCE4 BL __user_initial_stackheap(0x001030F4) 0x00103D60 E8BD4020 LDMIA R13!,{R5,R14} 0x00103D64 E3A06000 MOV R6,#global_variable(0x00000000) 0x00103D68 E3A07000 MOV R7,#global_variable(0x00000000) 0x00103D6C E3A08000 MOV R8,#global_variable(0x00000000) 0x00103D70 E3A0B000 MOV R11,#global_variable(0x00000000) 0x00103D74 E3C11007 BIC R1,R1,#0x00000007 0x00103D78 E1A0C005 MOV R12,R5 0x00103D7C E8AC09C0 STMIA R12!,{R6-R8,R11} 0x00103D80 E8AC09C0 STMIA R12!,{R6-R8,R11} 0x00103D84 E8AC09C0 STMIA R12!,{R6-R8,R11} 0x00103D88 E8AC09C0 STMIA R12!,{R6-R8,R11} 0x00103D8C E1A0D001 MOV R13,R1 0x00103D90 E12FFF1E BX R14 exit: 0x00103D94 0004 LSL R4,R0,#0 0x00103D96 46C0 NOP 0x00103D98 46C0 NOP 0x00103D9A 0020 LSL R0,R4,#0 0x00103D9C F7FC BL $Ven$TA$I$$__rt_exit(0x001002CC) - Part #1 0x00103D9E FA96 BL $Ven$TA$I$$__rt_exit(0x001002CC) - Part #2 0x00103DA0 E59F0000 LDR R0,[PC] 0x00103DA4 E12FFF1E BX R14 0x00103DA8 00200534 DD 0x00200534 ``` 这里一开始把`0x200534`载入`R0`,继而载入`R13`,然后压栈的两个寄存器,这时候的R13地址不在合法的栈地址内,查map发现在这里 ``` __libspace_start 0x00200534 Data 96 libspace.o(.bss) ``` 我猜想这个过程应该是把这部分数据拿来当个临时堆栈用了一下,因为这时候stack还没设置,不知道是不是这么个意思。 抛个砖先 :)
查看更多
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
3.7k
关于作者
mbbill
这家伙很懒,什么也没写!
提问
3
回答
43
被采纳
0
关注TA
发私信
相关问题
1
请问rtt-studio工程如何转为MDK工程?
2
时间片视频教程移植,时间片功能不起作用是什么情况
3
使用env生成keil5工程,怎么添加全局宏?
4
Rtthread-studio编译报错
5
cubemx配置keil正常输出stdio输出不了PWM寄存器的值仿真一样?
6
RTT-Studio生成的工程,子目录没有SConscript文件
7
通过ENV生成的MDK5工程,为什么默认的启动文件是context_gcc.S呢
8
试用了一下liteos,我又回来啦
9
在applications文件夹下添加了新的.c/.h文件后无法生成MDK5工程
10
pandora开发板使用cjson,内存不足。
推荐文章
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组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部