扩大sbl代码段

一、简介

本文以SimpleBLEPeripheral工程为例,介绍如何将SBL的bootloader的默认大小从2K修改为8K。


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

硬件平台:Smart RF(主芯片CC2541)

下载软件:SerialBootTool-v1.3.2


三、版权声明

此博文转载

博主:甜甜的大香瓜


原文地址:http://blog.youkuaiyun.com/feilusia

联系方式:897503845@qq.com

技术交流QQ群(香瓜BLE之CC2541):127442605


四、实验前提

在进行本文步骤前,请先阅读以下博文:

1、《CC2541之SBL》:http://blog.youkuaiyun.com/feilusia/article/details/52016766


五、实验步骤

1、修改SBL的xcl文件(……\BLE-CC254x-1.4.0\Projects\ble\util\SBL\app\cc254x\sbl_cc254x.xcl)

[cpp]  view plain  copy
  1. // CODE Root - Taking the first 2K of flash (the 1st page contains the INTVEC's).  
  2. //  
  3. -D_IVEC_BEG=0x0000  
  4. -D_IVEC_END=0x07FF  

修改为

[cpp]  view plain  copy
  1. //8K  
  2. -D_IVEC_BEG=0x0000  
  3. -D_IVEC_END=0x1FFF  

注意这里必须要修改,不能用//注释,否则后面工程编译会报错。


2、修改SBL工程中的文件(……BLE-CC254x-1.4.0\Projects\ble\util\SBL\iar\cc254x\sbl.eww

1)修改跳转地址(sbl_main.c

[cpp]  view plain  copy
  1. asm("LJMP 0x2000");       //8K asm("LJMP 0x800");    

2)修改跳转地址(sbl_ivec.s51)

[cpp]  view plain  copy
  1. OFFSET   EQU    0x2000//8K 0x800  

3)修改CRC地址(sbl_app.h)

[cpp]  view plain  copy
  1. /* 
  2. #define HAL_SBL_IMG_BEG                (uint16)(0x800 / HAL_FLASH_WORD_SIZE) 
  3. #define HAL_SBL_IMG_CRC                (uint16)(0x890 / HAL_FLASH_WORD_SIZE) 
  4. */  
  5. //8K  
  6. #define HAL_SBL_IMG_BEG                (uint16)(0x2000 / HAL_FLASH_WORD_SIZE)  
  7. #define HAL_SBL_IMG_CRC                (uint16)(0x2090 / HAL_FLASH_WORD_SIZE)  

3、修改应用工程的xcl文件(……\BLE-CC254x-1.4.0\Projects\ble\common\cc2540\cc254x_f256_sbl.xcl)

1)修改应用代码首地址

[cpp]  view plain  copy
  1. // CODE  
  2. //  
  3. -D_CODE_BEG=0x0800  
  4. -D_CODE_END=0x7FFF  
修改为

[cpp]  view plain  copy
  1. // CODE  
  2. //  
  3. -D_CODE_BEG=0x2000  
  4. -D_CODE_END=0x7FFF  

2)修改CRC地址

[cpp]  view plain  copy
  1. -Z(CODE)CHECKSUM=0x890-0x891  
  2. -Z(CODE)CRC_SHDW=0x892-0x893  
修改为

[cpp]  view plain  copy
  1. -Z(CODE)CHECKSUM=0x2090-0x2091  
  2. -Z(CODE)CRC_SHDW=0x2092-0x2093  

3)修改CRC算法中使用到的CRC地址

[cpp]  view plain  copy
  1. -J2,crc16,=_CODE_BEG-890,894-_BANK7_END  
修改为

[cpp]  view plain  copy
  1. -J2,crc16,=_CODE_BEG-2090,2094-_BANK7_END  

4、实验结果

1)按照《CC2541之SBL》中的步骤重做,会发现应用工程中的simpleBLEPeripheral.map中的应用代码位置由2K(0x800)位置变为8K(0x2000)位置,对比如下图



### Sparse Bayesian Learning 信道估计 示例代码 Sparse Bayesian Learning (SBL) 是一种用于稀疏信号恢复的有效方法,在通信领域中常被应用于信道估计问题。以下是基于 SBL 的信道估计算法的一个简单 Python 实现示例: #### 示例代码 以下是一个简单的 SBL 算法框架,适用于 MIMO 或单天线系统的信道估计场景。 ```python import numpy as np from scipy.linalg import solve_triangular def sparse_bayesian_learning(y, H, alpha_init=1e-6, beta_init=1e-6, tol=1e-5, max_iter=100): """ 使用 Sparse Bayesian Learning 进行信道估计 参数: y: 接收信号向量 (形状为 [N, ]) H: 观测矩阵 (形状为 [N, K]) alpha_init: 初始超参数 α (噪声精度) beta_init: 初始超参数 β (权重精度) tol: 收敛容忍度 max_iter: 最大迭代次数 返回: w_est: 估计的信道系数 (形状为 [K, ]) alpha_final: 最终的 α 值 beta_final: 最终的 β 值 """ N, K = H.shape w_est = np.zeros(K) # 初始化权值 Sigma = np.eye(K) / alpha_init # 协方差初始化 alpha = alpha_init * np.ones(K) beta = beta_init for i in range(max_iter): # 更新后验分布 Sn_inv = np.diag(alpha) + beta * np.dot(H.T, H) mn = beta * np.dot(np.linalg.inv(Sn_inv), np.dot(H.T, y)) # 计算 Gamma 和更新超参数 gamma = 1 - alpha * np.diagonal(Sigma) alpha_new = gamma / (np.power(mn, 2) + 1e-8) beta_new = (N - np.sum(gamma)) / (np.linalg.norm(y - np.dot(H, mn)) ** 2 + 1e-8) # 检查收敛性 if np.max(np.abs(alpha - alpha_new)) < tol and np.abs(beta - beta_new) < tol: break # 更新变量 alpha = alpha_new beta = beta_new Sigma = np.linalg.inv(np.diag(alpha) + beta * np.dot(H.T, H)) w_est = beta * np.dot(Sigma, np.dot(H.T, y)) return w_est, alpha, beta # 测试函数 if __name__ == "__main__": # 设置随机种子以便复现实验结果 np.random.seed(42) # 定义系统参数 K = 10 # 信道长度 N = 20 # 接收样本数 SNR = 20 # 信噪比 # 构造真实信道 h 和观测矩阵 H h_true = np.zeros(K) non_zero_indices = np.random.choice(range(K), size=int(K/3), replace=False) h_true[non_zero_indices] = np.random.randn(len(non_zero_indices)) H = np.random.randn(N, K) noise_var = np.var(h_true) * 10**(-SNR / 10) n = np.sqrt(noise_var) * np.random.randn(N) y = np.dot(H, h_true) + n # 应用 SBL 方法进行信道估计 h_est, _, _ = sparse_bayesian_learning(y, H) # 输出结果 print("True Channel:", h_true) print("Estimated Channel:", h_est) ``` --- ### 关键概念解释 1. **SBL 背景**: SBL 是一种贝叶斯推断方法,通过引入先验分布和超参数调整来实现稀疏信号重建[^1]。这种方法特别适合于解决高维稀疏问题,例如无线通信中的信道估计。 2. **超参数优化**: 在上述代码中,`alpha` 控制每个信道路径的重要性,而 `beta` 表示噪声水平。这两个参数在每次迭代中动态更新,直到达到收敛条件为止。 3. **稀疏性假设**: 由于实际信道通常具有稀疏特性(只有少数几条路径显著),因此 SBL 可以有效减少不必要的复杂性和干扰[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值