⚠️裸机仓库:https://gitee.com/simonchina_carel_li/mini2440-bare-metal.git
⚠️Tag:
11-sdram-apply
1. 这次要做什么?
我们已经完成了sdram的初始化,现在sdram已经可以使用了
我们之前的固件,栈空间是跑在SOC内置的4KB的SRAM上,
对于后续的固件开发,肯定是不够的,
现在我们需要将整体程序,适配到SDRAM
2. 方案分析
| 项目 | 怎么做 |
|---|---|
| 将栈放到sdram | 修改SVC模式和IRQ模式栈指针到SDRAM顶部,并多预留IRQ栈空间 |
| .data段和.bss的处理适配 | 这个不需要修改 |
| 链接脚本修改 | 增加sdram内存块,并重新段布局 |
3. 代码实现
start.s,
C
/*
@ 设置栈顶(给IRQ SP预留512空间)
ldr sp, =0x40000E00
*/
@ 设置栈顶(给IRQ SP预留4K空间)
ldr sp, =(0x34000000 - 4096)
irq_handler.c,
C
/// @brief 中断控制器初始化
/// 设置IRQ模式的SP, 禁用IRQ/FIQ
void irq_handler_init()
{
unsigned long cpsr;
__asm__ volatile (
// 读取cpsr
"mrs %0, cpsr\n\t"
// 禁用IRQ/FIQ, 切换至IRQ模式
"msr cpsr_c, #0b11010010\n\t"
// 设置IRQ模式的SP
// "ldr sp, =0x40001000\n\t"
"ldr sp, =0x34000000\n\t"
// 恢复原来模式和原始中断状态
"msr cpsr, %0\n\t"
: "=&r" (cpsr)
:
: "sp", "cc", "memory"
);
// ...略...
}
mini2440_nor.lds,
C
MEMORY
{
rom (rx) : ORIGIN = 0x00000000, LENGTH = 16M
sram (rwx) : ORIGIN = 0x40000000, LENGTH = 4K
sdram (rwx) : ORIGIN = 0x30000000, LENGTH = 64M // 增加sdram区域
}
// 下方的sram改为sdram
重新编译按键测试程序,make key,
烧录运行,测试,
按键依旧可用,中断照常触发
这节有点划水的感觉~