keil中,RTT 实现代码放到 vector和code 放到ram

本文介绍了如何将STM32F103ZET平台的中断向量和代码段放到RAM中运行。首先,通过修改.sct文件重新规划RAM和ROM。然后,编写代码将中断向量从ROM复制到RAM,并更新映射。对于代码部分,使用#pragma指令将特定代码段放入RAM。最终,通过检查.map文件验证操作结果,确保代码成功在RAM中运行。

        把代码和vector 放到ram的方法有很多种。参考了网上的资料和自己实际应用中的情况。先做出总结:

        平台以 stm32f103ZET为例子:

一、vector 放到ram中。

(1)第一步需要修改:.sct文件,重新规划ram和rom。根据 rtt官网提供的 sct文件。进行修改:

        RTT官网提供的源文件:

        修改后的sct文件:

 (2)、编写代码,复制rom的vector 到 ram中,并重新更改 vector 映射。

二、code放到 ram中。

(1)、修改sct文件,并添加 对应的 section。

 (2)、把指定 代码放到ram中。以#pragma arm section code = “RAMCODE” 开头,以#pragma arm section结尾。

(3)察看下结果:察看对应的.map文件。

对比下:没有放到ram中的情况:

明显看到 

RW_IRAM1这个ram中不存在任何东西。

(4)运行结果:代码运行在 ram中。

keil中,RTT实现代码放到vector和code放到ram-嵌入式文档类资源-优快云下载

另外的博客园的参考方法:
STM32 把程序放到 RAM中运行 - wuhh123 - 博客园stm32可以将代码直接下载到RAM中时行程序调试,同时可以有效避开STM32 Flash 擦写次数有限问题,其实除了仿真调试时将程序设置在RAM中可以解决FLASH擦写次数问题外,如果程序实际运行时https://www.cnblogs.com/wuhh123/p/14308954.html

在IAR环境下将代码放到RAM中运行有以下几种方法: - **将尽可能多的代码重定向到RAM中**:客户APP工程基于IAR开发环境,若要将工程里尽可能多的代码重定向到RAM里执行,仅留必要或指定的源文件代码在Flash中执行,可参考痞子衡旧文 《在IAR下将关键函数重定向到RAM中执行的方法》,不过该需求与旧文实现相反,正常是指定一些代码重定向到RAM,此次是保留指定代码在Flash,其余重定向到RAM [^1]。 - **将整个源文件代码重定向到任意RAM**:由于IAR自身限制,可通过在相应代码里增加一些自定义段修饰来实现,但这种方法因手工活太多比较繁琐,不适用于要将尽可能多代码重定向到RAM的需求 [^2]。 - **按特定方法在链接文件中重定向**:按 《在IAR下将关键函数重定向到RAM中执行的方法》 一文2.3针对源文件中全部函数的方法,在链接文件中仅将object ram_code.o放到initialize by copy语句里,ram_code.o中的内容会被统一重定向到工程数据段RW所在RAM区域里(即DTCM 0x20000000 -),如示例“initialize by copy { readwrite, section .textrw, section CodeQuickAccess, object ram_code.o }; //place in ITCM_region { object ram_code.o };”,这种情况下函数重定向可能成功 [^3]。 - **手动拷贝自定义程序段到RAM**:手动拷贝自定义程序段可解决IAR链接器限制,且拷贝位置可由用户决定。若希望将程序重定向到外部PSRAM执行,可在main函数里做完PSRAM初始化之后再做程序段的拷贝。不过阅读相关内容前需要对 《IAR链接文件(.icf)》、《IAR映射文件(.map)》 这两种文件有所了解,使用的IAR EWARM软件版本一般为v9.30.1 [^4]。 ### 示例代码(将函数定位到RAM中执行) ```c uint32_t const * __iar_zero_init3( uint32_t const * p ) { uint32_t size; while ( ( size = *p++ ) != 0 ) { uint32_t d = *p++; uint32_t * dest; if ( d & 1 ) { d -= 1; d += __iar_SB; } dest = (uint32_t*) d; do { *dest++ = 0; size -= 4; }while ( size != 0 ); } return p; } #pragma section = "Region$$Table" void __iar_data_init3( void ) { FAddr const * pi = __section_begin("Region$$Table"); table_ptr_t pe = __section_end ("Region$$Table"); while ( pi != pe ) { init_fun_t * fun = (init_fun_t *) ( (uint32_t) pi + pi->mOff ); ++pi; pi = fun( pi ); } } Mode_USR EQU 0x10 Mode_FIQ EQU 0x11 Mode_IRQ EQU 0x12 Mode_SVC EQU 0x13 Mode_ABT EQU 0x17 Mode_UND EQU 0x1B Mode_SYS EQU 0x1F ; available on ARM Arch 4 and later I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled __iar_program_start MSR CPSR_c, #Mode_SYS|F_Bit|I_Bit ldr sp,=SFE(CSTACK) ; End of CSTACK(user) BL __iar_data_init3 BL main B . ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值