arm怎么声明一些函数在运行时arm 存储器加载到内存进ram

21ic官方微信-->
后使用快捷导航没有帐号?
查看: 3289|回复: 3
在KEIL中,怎么把一个函数定义到RAM空间?
&&已结帖(0)
主题帖子积分
实习生, 积分 33, 距离下一级还需 17 积分
实习生, 积分 33, 距离下一级还需 17 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 33, 距离下一级还需 17 积分
实习生, 积分 33, 距离下一级还需 17 积分
我用的ARM芯片有个变态的功能,当代码在FLASH(ON-CHIP)中执行时,不能对此FLASH的其他块或页进行写操作,我只能把写FLASH的函数放在RAM里,但其他代码还是在FLASH里运行。
1.如何在KEIL中把某一个函数定义到RAM地址空间中?(编译后的代码段可复制到RAM中运行)
2.如何知道这个函数编译后的二进制码有多大?
, , , , , , , ,
主题帖子积分
实习生, 积分 41, 距离下一级还需 9 积分
实习生, 积分 41, 距离下一级还需 9 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 41, 距离下一级还需 9 积分
实习生, 积分 41, 距离下一级还需 9 积分
用分散加载机制可以实现,说白了就是在RAM中划出一段空间留给该函数即可。
主题帖子积分
实习生, 积分 33, 距离下一级还需 17 积分
实习生, 积分 33, 距离下一级还需 17 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 33, 距离下一级还需 17 积分
实习生, 积分 33, 距离下一级还需 17 积分
多谢楼上的,已经解决了!
主题帖子积分
资深技术员, 积分 422, 距离下一级还需 78 积分
资深技术员, 积分 422, 距离下一级还需 78 积分
主题帖子积分
专家等级:结帖率:66%
主题帖子积分
资深技术员, 积分 422, 距离下一级还需 78 积分
资深技术员, 积分 422, 距离下一级还需 78 积分
去看看分散加载,还有,楼上最好说一下怎么解决的
热门推荐 /3ARM官方的FIR滤波器,IIR滤波器函数边计算边添加数据的方法,计算大量数据时有效降低RAM需求|STM32F407 - 安富莱电子论坛 - Powered by phpwind
查看完整版本: [--
ARM官方的FIR滤波器,IIR滤波器函数边计算边添加数据的方法,计算大量数据时有效降低RAM需求
具体实现参考DSP教程的: 第37章 FIR滤波器实现配套例子即可,这个例子在教程中有简单讲解。/read.php?tid=3886************************************************************************************************比如我们要求解320点数据的FIR滤波,可以通过下面这种方式分多次进行,从而节省RAM空间。#define TEST_LENGTH_SAMPLES&&320&&&&/* 采样点数 */#define BLOCK_SIZE&&&&&&&&&& 32&&&&&&&&&&&&&&&&/* 这里是调用一次arm_fir_f32处理的采样点个数 */ uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE;&&&&&&&&&& /* 需要调用arm_fir_f32的次数 */ 实际调用函数的时候采用下面的方式即可: /* 实现FIR滤波,共调用numBlocks次&&*/for(i=0; i & numB i++){&&&&&&arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);} 详细的实现可以看第37章配套的例子。
已经整理好。
越来越高深了。。。一个周期320个点,也是很高的采样速率了。如果一个周期16个点,不知道数字滤波器的效果如何?
:越来越高深了。。。一个周期320个点,也是很高的采样速率了。如果一个周期16个点,不知道数字滤波器的效果如何? ( 09:29) 16个点太少,线性相位的FIR滤波有个群延迟的,延迟的点数由滤波器的阶数确定。
1进1出怎么实现?
查看完整版本: [--
Powered by
Time 0.042803 second(s),query:2 Gzip enabled温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
* 每天都修炼一下英语流利说
* 不要让注意力局限在技术细节上
* 耐心地接受外界建设性的信息
* 注意休息,保重身体
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
U-BOOT推荐阅读:
阅读(7223)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'U-boot如何向kernel传递参数 + kernel如何读取参数',
blogAbstract:'UBOOT和Linux内核之间正是通过这个扩展了的TAG区域来进行复杂参数的传递,如 command line,文件系统信息等等,用户也可以扩展这个TAG来进行更多参数的传递。TAG区域的首地址,正是R2的值。',
blogTag:'u-boot,kernel,参数,atag,ram',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:7,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'* 每天都修炼一下英语流利说\n* 不要让注意力局限在技术细节上\n* 耐心地接受外界建设性的信息\n* 注意休息,保重身体',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}如何让程序在RAM中运行_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
如何让程序在RAM中运行
上传于||文档简介
&&来​处​S​T​M​C​U​,​介​绍​在​I​A​R​ ​A​R​M​中​如​何​让​S​T​M2​在​R​A​M​运​行​程​序
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢后使用快捷导航没有帐号?
查看: 3447|回复: 16
请问BOOTLOAD中怎么跳转到RAM中的MAIN函数中
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 3, 距离下一级还需 2 积分
一粒金砂(初级), 积分 3, 距离下一级还需 2 积分
网上看了些资料,基本上是说先拷贝代码到RAM,然后考RW、ZI什么的,最后跳转到RAM的MAIN函数中,有些不明白,烦请各位能提点一下:
我打算用ADS编译一个BOOTLOAD,程序放FLASH中,运行时在RAM中跑以便能修改FLASH中的内容。那我是不是需要按以下方法进行编写代码:
1.在ADS中填写的RO、RW、IMAGE ENTRY POINT好像都是指的是运行地址吧,那我需要正确填写程序运行时的地址
2.拷贝完成后怎么跳转到RAM中的MAIN函数?
用ldr& & & & pc,& & & & __main好像跳不过去,用BL __main好像会跳到FLASH的MAIN函数。
3.比如ADS设置的运行地址为0X,这样编译好后我用H-FLASHER把他烧入FLASH中(FLASH上电后的地址是0X),应该是这样
有些东西实在是不明白,恳请各位大侠能帮忙,谢谢!
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
你把FLASH里的东西都拷到RAM里,然后一个 BL main,就能跳到ram里的 main了 ,不会跳到flash里的 我试过的
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
BL是一个相对寻址,在使用BL之前你的PC要先跳到RAM里& &例如你把代码(这些代码包括了BL main)都拷到 0xc0000000开始的地方,那么你需要 ldr pc,=0xc0000000 ,而因为在0xc0000000 后面也有个 BL main , 所以,PC执行到那里自动会BL到 RAM里面的 main ,而不会到flash里的main
不知道楼主明白了没?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
呵呵,我就没想到要先把PC值跳到RAM中,呵呵,那我先期在ADS中设定运行地址(RO、RW的选项)RAM的地址,编译后再烧入FLASH应该可以吧?我试试先,谢谢了
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
那个ldr pc,=0xc0000000 然后再BL main应该是不对了吧?第一句就已经对PC赋值了,就马上跳到0XC0000000去了,BL MAIN这句更本就不会执行的吧。
我在ADS中设置运行地址为0X,RW为0X,(这样我就只对RO部分操作而不用对RW部分进行操作了)编译过后烧BIN文件于0X的FLASH中,然后在FLASH中通过
& && && && & ldr r0,=STARADDR;0X代码起点& & & & & & & &
& & & && & ldr& & & & r1,=RAMADDRS;0X运行起点
& & & && & ldr& & & & r2,=CODELEN;0X代码结尾
& & & && & ldmia& & & & r0!, {r3-r10}
& & & && & stmia& & & & r1!, {r3-r10}
& & & && & cmp& & & & r0, r2
& & & && & ble& & & & copy_loop
简单拷贝到RAM,然后就跟着一句BL __main,在main中我有段程序想得到某个函数的位置
uint32 addrpc,
addrpc=(uint32)UART0_I
这个位置我用串口发到PC,观察到是0X800....,而不是0X81....,这样就判断出这个MAIN并不是在RAM中执行的。
请问sherlock_lai 你是怎么判断程序在RAM中执行而不是在FLASH中执行?
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
在boot的汇编部分最后,会先取得main函数相对系统复位入口的偏移地址量,对于大部分ARM体系CPU来说,复位入口是0x0,那么main的地址偏移量假设是0x3000(这只是个假设值,每个cpu,每个版本对应的boot都可能有差别,不过因为是取相对偏移,所以没关系)。
然后RAM有一个确定好的地址,如果是无MMU,那么直接操作RAM的物理地址,如果有MMU并且已启用,那么操作RAM的虚拟地址。
boot复制到RAM中也会有一个地址,以这个地址作为boot入口地址(相当于复位时的0x0),然后加上main的相对地址偏移量,就可以得到main在RAM中的地址,然后jump过去就行。
判断在RAM还是flash,直接看地址就行,不管是物理地址,还是虚拟地址,总归有空间大小规定的。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
你用ADS的AXD&&RO先设在flash里,就直接可以单步看程序往哪跳了
至于这条指令
ldr pc,#0xc0000000 //我的0xc0000000 是RAM地址,
在这条指令之前,不是已经把代码都搬到 0xc0000000了吗?
那么PC执行 0xc0000000 就相当于执行你刚开始在flash里的代码了
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
如果是拷贝整个BOOT到RAM,再执行ldr pc,#0xc0000000 将再次进入复位中断处理而不是进入MAIN函数,这样再次进行拷贝再次跳转到RAM,将进入循环而到不了MAIN。
另找到MAIN函数的偏移地址再在RAM基址的基础上加上偏移量进行跳转可以到达MAIN函数,不过我汇编不是太好,请问以下是否可以?
LDR R1,=MAIN;获取MAIN的绝对地址
ADD R1,R1,#0X;RAM和FLASH地址只差了0X,所以把在FLASH中的MAIN地址加上0X即可得到在RAM中的MAIN地址
BX R1;到底LDR PC,R1还是BX这条?
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
我也碰到过这个问题,虽然用的不是ARM Core,但是希望能对你有帮助。
我是先修改.lds文件,将所有程序的vma指向ram的地址,然后在boot程序一开始先初始化ram再将所有程序从flash搬移到ram中。因为在链接时已经将main的程序地址指向了ram中的vma所以直接main();就可以了。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
很感谢大家的指点,经过几天的摸索,我探出了点眉目,各位看了有问题请指出来,如果正确那也对正遇上我这种问题的兄弟们一点帮助:以下都为LPC2200为基础,FLASH为BANK0(0x),RAM为BANK1(0X)
1.中断向量表
;中断向量表
& && &&&LDR& &&&PC, ResetAddr
& && &&&LDR& &&&PC, UndefinedAddr
& && &&&LDR& &&&PC, SWI_Addr
& && &&&LDR& &&&PC, PrefetchAddr
& && &&&LDR& &&&PC, DataAbortAddr
& && &&&DCD& &&&0xb9205f80
& && &&&LDR& &&&PC, IRQ_Addr
& && &&&LDR& &&&PC, FIQ_Addr
ResetAddr& & & & & & & & & & & & DCD& & & & & & & & ResetInit
UndefinedAddr& && & DCD& &&&0x
SWI_Addr& && && && &DCD& &&&0x
PrefetchAddr& && &&&DCD& &&&0x8100000c
DataAbortAddr& && & DCD& &&&0x
Nouse& && && && && &DCD& &&&0
IRQ_Addr& && && && &DCD& &&&0x
FIQ_Addr& && && && &DCD& &&&0x8100001c
2.BOOTLOAD的ADS中我为了怕整理RW麻烦就没用分散加载了,把RO写了0X,RW写了0X81F00000,IIMAGE 入口地址0X,第一步拷贝我只是做个试验,所以就拷贝固定大小的代码到RAM了
& && && && & ldr r0,=STARADDR;0x& & & & & & & &
& & & && & ldr& & & & r1,=RAMADDRS;0x
& & & && & ldr& & & & r2,=CODELEN;0x代码结尾地址
& & & && & ldmia& & & & r0!, {r3-r10}
& & & && & stmia& & & & r1!, {r3-r10}
& & & && & cmp& & & & r0, r2
& & & && & ble& & & & copy_loop& &
ldr pc,=main+0x1000000
4.在应用程序中的中断,因为向量地址在0XFFFFF030,所以需要动一下
;中断向量表
& && &&&LDR& &&&PC, ResetAddr
& && &&&LDR& &&&PC, UndefinedAddr
& && &&&LDR& &&&PC, SWI_Addr
& && &&&LDR& &&&PC, PrefetchAddr
& && &&&LDR& &&&PC, DataAbortAddr
& && &&&DCD& &&&0xb9205f80
& && &&&LDR& &&&PC, IRQ_Addr
& && &&&LDR& &&&PC, FIQ_Addr
ResetAddr& && && &&&DCD& &&&ResetInit
UndefinedAddr& && & DCD& &&&Undefined
SWI_Addr& && && && &DCD& &&&SoftwareInterrupt
PrefetchAddr& && &&&DCD& &&&PrefetchAbort
DataAbortAddr& && & DCD& &&&DataAbort
Nouse& && && && && &DCD& &&&0
IRQ_Addr& && && && &DCD& &&&IRQ_Handler
FIQ_Addr& && && && &DCD& &&&FIQ_Handler
。。。。。。
IRQ_Handler
& && &&&STMFD& &SP!, {R0-R3, LR}
& && &&&mov r0,#0x020
& && &&&ldr pc,[r0,#-0x0ff0]
& && &&&LDMFD& &SP!, {R0-R3, LR}
& && &&&SUBS& & PC,&&LR,&&#4
。。。。。。。
请各位大侠指点指点,有错可要一定指出哟,谢谢!
在线时间1 小时
TA的帖子TA的资源
宇宙尘埃, 积分 -20, 距离下一级还需 20 积分
宇宙尘埃, 积分 -20, 距离下一级还需 20 积分
忘了说了,应用程序中ADS中应该RO设为0x
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
原来用的是LPC22xx系列的,没有MMU,难怪是操作物理地址的。
ldr pc,=main+0x1000000
是关键,只要这个地址不写错,就不会有问题。当然也得要求你的boot的main是正确的可执行才行。
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
直接发我写的汇编程序好了&&可以用的
;copy code,data, clear zi
& & & & ldr& & & & & & & & r0,=beg
& & & & ldr& & & & & & & & r1,=0x0c008000
& & & & ldr& & & & & & & & r2,Topofrom
& & & & ldmia& & & & r0!,{r4-r7}
& & & & stmia& & & & r1!,{r4-r7}
& & & & cmp& & & & & & & & r0,r2
& & & & bcc& & & & & & & & %b0
& & & & ldr& & & & & & & & pc,=0x0c008000& & & && &
beg& & & &
& & & & LDR& & & && &&&r0, Topofrom& & & & ; Get pointer to ROM data
& & LDR& & & && &&&r1, Baseofram& & & & ; and RAM copy
& & LDR& & & && &&&r3, Baseofzi
0& & & & & & & &
& & CMP& & & && &&&r1, r3& & & && &&&; Copy init data
& & ldrcc& &r2, [r0], #4& & ;--& LDRCC r2, [r0] + ADD r0, r0, #4& & & & & & & &&&
& & strcc& &r2, [r1], #4& & ;--& STRCC r2, [r1] + ADD r1, r1, #4
& & BCC& & & && &&&%B0& & & & & & & &
& & LDR& & & && &&&r1, T Top of zero init segment
& & MOV& & & && &&&r2, #0
2& & & & & & & &
& & CMP& & & && &&&r3, r1& & & && &&&; Zero init
& & STRCC& &r2, [r3], #4
& & BCC& & & && &&&%B2
;--------enter main
& & & & BL& & & & Main
& & & & B& & & & .
LZ慢慢研究吧,这个是我用的程序
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
从beg开始的代码都copy到ram里,然后从 ram里的beg开始执行,beg后面的代码是对数据区的复制清零操作,之所以把这个也copy到ram里执行是因为这段操作可能需要一点时间(如果数据段很长的话),放到ram里执行会比较快
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
谢谢,这种拷贝部分代码也是种好方法,呵呵,我原也想用这种,但当时一门心思想着定位MAIN,没想过从MAIN前拷贝,呵呵,谢谢大家了。
在线时间13 小时
TA的帖子TA的资源
宇宙尘埃, 积分 -2, 距离下一级还需 2 积分
宇宙尘埃, 积分 -2, 距离下一级还需 2 积分
sherlock_lai 的那段是自己写的吗?我似乎在2410的公版bootload中看到过
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
前面自己写的, 从beg开始那段是三星里的代码
Powered by
逛了这许久,何不进去瞧瞧?}

我要回帖

更多关于 stm32 ram运行 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信