012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇

⚠️裸机仓库: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

烧录运行,测试,

按键依旧可用,中断照常触发

这节有点划水的感觉~

相关推荐
二哈赛车手4 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
为何创造硅基生物5 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
仰泳之鹅5 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
jolimark6 小时前
C语言自学攻略:小白入门三步走
c语言·编程入门·学习路线·实践项目·自学攻略
于小猿Sup7 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
cen__y7 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
xian_wwq7 小时前
【学习笔记】AGC协调控制系统概述
笔记·学习
社交怪人7 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
x_yeyue8 小时前
三角形数
笔记·算法·数论·组合数学
chao1898448 小时前
STM32 HAL库驱动AT24C02 EEPROM例程
stm32·单片机·嵌入式硬件