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,

烧录运行,测试,

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

这节有点划水的感觉~

相关推荐
en.en..2 小时前
STM32(F429)启动模式与两种烧录方式
stm32·单片机·嵌入式硬件
单片机仿真设计3 小时前
基于 51 单片机的数字温度计(DS18B20+LCD1602+Proteus 仿真,支持阈值可调声光报警)
单片机·嵌入式硬件·proteus·课设
芝士爱沙拉3 小时前
原生内置agent智能开发能力的MCU IDE-MounRiver Studio
ide·单片机·嵌入式硬件
路上有只喵3 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇4
单片机·嵌入式硬件
YYRAN_ZZU3 小时前
FlameGraph 火焰图介绍和使用
linux·嵌入式硬件
小向是个Der3 小时前
嵌入式进阶——编译与链接
汇编·单片机·学习·编译原理·交叉编译
江屿风3 小时前
【Plain Language Large Model】【从麦当劳点餐到Redis接入:MCP如何让AI工具集成变简单】流食般投喂
人工智能·redis·笔记·语言模型·llm·mcp
海绵宝宝转agent4 小时前
Leetcode二叉树算法个人理解
笔记·学习·算法·leetcode·深度优先
小oo呆4 小时前
【学习心得】MCP工具开发学习笔记
笔记·学习
【 STM32开发 】4 小时前
【CubeMX+STM32】SD卡 文件系统读写 FatFs+SDIO+DMA (F103版本)
stm32·单片机·嵌入式硬件·1024程序员节