完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
不太清楚SRAM是如何工作的,是cpu自己将我们定义的buf、变量直接分配到这里面,还是需要使用什么函数来手动分配,记得有一个malloc函数,这是做什么的啊,堆和栈有什么区别啊
|
|
相关推荐
7个回答
|
|
最简单就是用 __attribute__((at(????)))
|
|
|
|
|
|
|
|
st使用SRAM首先用一个分散加载文件,告诉编译你有哪些存储空气,包括ram 和ROM。然后malloc就从ram中分配内存。分散加载文件时arm 构架规定的
给你举个IAR 5.4的官方历程给你举个例子 1、iar工程打开后,从project-》option-》link看到link文件来自$PROJ_DIR$STM32F10x_FLASH.icf,对应安装目录的D:Program FilesIAR SystemsEmbedded Workbench 5.4armexamplesSTSTM32F10xstm32f10x_stdperiph_libProjectSTM32F10x_StdPeriph_ExamplesFSMCSRAMstm32f10x_flash.icf 这个文件下定义了几个预编译命令,告诉编译器ROM/RAM起始和终止地址在哪。 define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000 ; define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; /*-Sizes-*/__ICFEDIT_size_cstack__ define symbol = 0x400; define symbol __ICFEDIT_size_heap__ = 0x200; /**** End of ICF editor section. ###ICF###*/ 2、同时在这个文件 D:Program FilesIAR SystemsEmbedded Workbench 5.4armconfigideIcfEditorcortex_v1_0.xml文件里规定了堆栈和RAM ROM的位置是哪个地址。其中ROM是程序存放地址,RAM是分配内存的地址。 Start: End: __ICFEDIT_region_ROM_start__ __ICFEDIT_region_ROM_end__ The start address of the ROM region The end address of the ROM region __ICFEDIT_region_RAM_start__ __ICFEDIT_region_RAM_end__ The start address of the RAM region The end address of the RAM region 3、以上几个文件综合起来生成一个分散加载文件,达到合理分配内存的目的。给你一个IAR工程例子D:Program FilesIAR SystemsEmbedded Workbench 5.4armexamplesSTSTM32F10xstm32f10x_stdperiph_libProjectSTM32F10x_StdPeriph_ExamplesFSMCSRAM 4、建议多看看arm分散加载,你还可以自己定义分散加载,规定每个文件编译好放在哪个地址, 哪个文件/变量分配在哪个地址。 5、DSP和ARM都可以使用这种方法,具体使用查看编译器手册。 6、在MDK中直接直接指定片外片内内存的。或者自己写一个分散加载文件,编译使用那个分散加载来编译。 |
|
|
|
呵呵,干脆开个帖子,专业解答ARM基础知识
|
|
|
|
回复第 4 楼 于2014-01-10 00:00:38发表:
st使用SRAM首先用一个分散加载文件,告诉编译你有哪些存储空气,包括ram 和ROM。然后malloc就从ram中分配内存。分散加载文件时arm 构架规定的 给你举个IAR 5.4的官方历程给你举个例子 1、iar工程打开后,从project-》option-》link看到link文件来自$PROJ_DIR$STM32F10x_FLASH.icf,对应安装目录的D:Program FilesIAR SystemsEmbedded Workbench 5.4armexamplesSTSTM32F10xstm32f10x_stdperiph_libProjectSTM32F10x_StdPeriph_ExamplesFSMCSRAMstm32f10x_flash.icf 这个文件下定义了几个预编译命令,告诉编译器ROM/RAM起始和终止地址在哪。 define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000 ; define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; /*-Sizes-*/__ICFEDIT_size_cstack__ define symbol = 0x400; define symbol __ICFEDIT_size_heap__ = 0x200; /**** End of ICF editor section. ###ICF###*/ 2、同时在这个文件 D:Program FilesIAR SystemsEmbedded Workbench 5.4armconfigideIcfEditorcortex_v1_0.xml文件里规定了堆栈和RAM ROM的位置是哪个地址。其中ROM是程序存放地址,RAM是分配内存的地址。 Start: End: __ICFEDIT_region_ROM_start__ __ICFEDIT_region_ROM_end__ The start address of the ROM region The end address of the ROM region __ICFEDIT_region_RAM_start__ __ICFEDIT_region_RAM_end__ The start address of the RAM region The end address of the RAM region 3、以上几个文件综合起来生成一个分散加载文件,达到合理分配内存的目的。给你一个IAR工程例子D:Program FilesIAR SystemsEmbedded Workbench 5.4armexamplesSTSTM32F10xstm32f10x_stdperiph_libProjectSTM32F10x_StdPeriph_ExamplesFSMCSRAM 4、建议多看看arm分散加载,你还可以自己定义分散加载,规定每个文件编译好放在哪个地址, 哪个文件/变量分配在哪个地址。 5、DSP和ARM都可以使用这种方法,具体使用查看编译器手册。 6、在MDK中直接直接指定片外片内内存的。或者自己写一个分散加载文件,编译使用那个分散加载来编译。 还是不明白 |
|
|
|
先把SRAM驱动起来。再把数据存到里面
|
|
|
|
你可以参考一下现成的代码,网上一大把
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1187 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1122 浏览 2 评论
2223 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1311 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1735 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 05:45 , Processed in 0.741126 second(s), Total 83, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号