Keil更改RAM地址

一、代码现象

在 Nordic nRF52 系列芯片的开发中,我们经常会遇到这样一个现象:当我们在项目中增加了一个新的 BLE 服务(例如 LED Button Service,LBS)后,程序在初始化 SoftDevice 时突然报错:

二、原理

原理:为什么 RAM 需要"改"

nRF52840 的 RAM 大小是固定的(256 KB)。但 RAM 被分为两个区域:

  • SoftDevice 区域(蓝牙协议栈) :协议栈运行时需要占用的 RAM(包括连接上下文、属性表、GATT 缓存等)。

  • 应用程序区域(你的代码、数据、堆栈) :你的代码(数据段、堆、栈)使用的 RAM。

这两个区域的分配由链接脚本(或 IDE 中的 RAM 起始地址)决定 。

通常在链接脚本中,RAM 起始地址被设置为 0x20000000 + SoftDevice 占用大小,而 SoftDevice 的占用大小取决于你的配置(例如最大连接数、ATT MTU、安全参数等)。

当你修改了配置(例如增加连接数、启用更多功能),SoftDevice 需要更多 RAM,但链接脚本中的偏移量(RAM 起始地址)没有同步增大,就会导致 SoftDevice 初始化时发现预留空间不足,从而报错并提示你增大偏移量。


为什么会提示从 0x20002250 改为 0x20002260?

计算过程:

  • SoftDevice 需要从 RAM 起始地址 0x20000000 开始占用一部分空间。

  • 你的应用程序当前配置的 RAM 起始地址是 0x20002250,这意味着为 SoftDevice 预留了 0x2250 字节(约 8.8 KB)。

  • 但是根据当前的项目配置(例如最大连接数、GATT 属性数量等),SoftDevice 实际需要 0x2260 字节(约 8.8 KB + 16 字节)。

  • 因此 SoftDevice 初始化时发现空间不足,返回错误,并提示你将 RAM 起始地址改为 0x20002260,即多预留 16 字节。

三、SoftDevice 的 RAM 需求由什么决定

SoftDevice 运行时需要存储大量动态数据,包括:

  • 连接上下文(每个连接约 1.2 KB)

  • GATT 属性表(服务、特征、描述符)

  • 安全数据库(绑定信息)

  • 队列缓存(如 Queued Writes)

  • 其他协议栈内部状态

这些需求的大小并非固定,而是 由应用程序的配置决定 。当你添加新的 BLE 服务时,例如增加了一个自定义服务(LBS),GATT 属性表的条目数增加了,SoftDevice 需要更多的 RAM 来存储这些属性。同样,增加连接数、启用更多安全功能等也会导致需求增加。

相关推荐
木子n16 小时前
车载以太网与SOME/IP服务化通信实战-01.从字节到服务:SOME/IP报文解析与四通道开销账
网络·网络协议·tcp/ip·车载以太网·some/ip
Jason_zhao_MR7 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
BSD_CGQ8 小时前
FSR传感器STM32 DMA高速采样工程实现(高精度、低CPU占用)
stm32·单片机·嵌入式硬件·压力传感器·源头工厂·柔性薄膜压力传感器·可变电阻压力传感器
Escalating_xu8 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
爱跳舞的烤冷面8 小时前
Linux篇——网络编程
网络
Knight_AL9 小时前
基于 Netty 实现的 WebSocket 服务端
网络·websocket·网络协议
芯岭技术郦10 小时前
32 位 ARM® Cortex®-M0+ 内核MCU普冉MS32C001-C
单片机·嵌入式硬件
骑着毛驴数星星10 小时前
STM32 CAN波特率与采样点计算,基于HAL库
stm32·单片机·嵌入式硬件
wuyk55511 小时前
《WiFi 嵌入式物联网开发全套实战》| 第 31 章 休眠唤醒 WiFi 断连、时间同步、网络恢复机制
网络·物联网·php
沫璃染墨11 小时前
从零入门计算机网络系列(一):计算机网络初识——从网络发展史到TCP/IP协议》
linux·网络·网络协议·tcp/ip·计算机网络