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,

烧录运行,测试,

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

这节有点划水的感觉~

相关推荐
yi0115 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
志尊宝6 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
Jason_zhao_MR6 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
BSD_CGQ7 小时前
FSR传感器STM32 DMA高速采样工程实现(高精度、低CPU占用)
stm32·单片机·嵌入式硬件·压力传感器·源头工厂·柔性薄膜压力传感器·可变电阻压力传感器
Escalating_xu8 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
weixin_448119948 小时前
Datawhale Easy Data × AI:笔记1 已重做,看新的笔记
笔记
要开心吖ZSH9 小时前
MySQL 慢 SQL 排查操作手册-个人笔记版
java·笔记·sql·mysql·慢查询
咖啡忍者10 小时前
【SAP】程制造生产计划PP-PI(Production Planning for Process Industries)
笔记
芯岭技术郦10 小时前
32 位 ARM® Cortex®-M0+ 内核MCU普冉MS32C001-C
单片机·嵌入式硬件
骑着毛驴数星星10 小时前
STM32 CAN波特率与采样点计算,基于HAL库
stm32·单片机·嵌入式硬件