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

烧录运行,测试,

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

这节有点划水的感觉~

相关推荐
M78佐菲1 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
俊基科技1 小时前
A-59U工业级多模语音处理模块在矿山矿井通信与呼叫报警系统中的应用
嵌入式硬件·嵌入式开发·硬件开发·ai降噪·回音消除·拾音降噪
噜~噜~噜~2 小时前
操作系统笔记-2.3.5.1.1生产者-消费者问题
笔记·操作系统
xiaobobo33302 小时前
c语言中for循环条件中定义临时栈变量的作用域
c语言·for循环条件定义栈变量·大括号作用域·独立栈变量
周周记笔记3 小时前
GD32F450xx MCU Datasheet 解读:硬件测试工程师的测试方法论
单片机·嵌入式硬件
惜离殇3 小时前
从零开始的敲代码生活--Linux应用软件(文件操作基础1)
linux·c语言·文件操作·标准io
潘潘的嵌入式日记5 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机
Huathy-雨落江南,浮生若梦6 小时前
Caddy 学习笔记 - 反向代理与 IP 封禁
笔记·学习·tcp/ip
AOI小白新手上路6 小时前
江科协51单片机16-1 AD/DA ADC 三通道综合显示(LCD1602 版)改造说明
单片机·嵌入式硬件·51单片机
xx~t6 小时前
嵌入式——Linux软件编程——网络1
linux·c语言·网络·vscode·网络协议