历史上的今天
返回首页

历史上的今天

今天是:2025年03月28日(星期五)

正在发生

2020年03月28日 | TQ2440开发板学习纪实(2)--- 设置堆栈并调用C函数

2020-03-28 来源:eefocus

本文根据上一篇TQ2440开发板学习纪实(1)—最简单的独立运行汇编程序进化而来。


0 ARM堆栈(Stack)基础知识

ARM支持满减类型的堆栈,满的意思是说堆栈指针SP(即R13)总是指向刚刚入栈的数据单元。与满相对应的就是不满,这种类型的栈指针SP指向栈顶的下一个空白单元。减的意思是说,栈底的内存地址大,栈顶地址小,压入数据时,栈向地址小的方向扩展。


目前我们只有4KB的内存可用,范围为:0x00000000-0x00000FFF,如下图:

初始化堆栈示意图

为了充分利用这4KB的内存,我们把堆栈 

指针SP初始指向0x00001000。这样设置有如下考虑:


必须4字节对齐,这是ARM的要求。也就是最后两位二进制位必须为0.

虽然最大可用内存地址为0x00000FFF,但是这里仍然可以设置SP=0x00001000。因为ARM堆栈是”满减”,所以后续使用时并不会使用0x00001000这个内存单元。

C语言的函数的实现,严重依赖于堆栈,虽然参数较少时,直接使用寄存器传参,但是调用函数前其返回地址必须存放到堆栈上供被调用函数返回使用。


1 项目源码

从本文开始,项目源码不再在文中完整列出,有需要的朋友,请自行去CSDN的git库中下载。本次源码的tag为v0.1。


设置堆栈代码就一行:


 /* set statck, must be aligned by 4 bytes */

    ldr sp, =0x00001000


调用C函数也非常简单


b Main


注意这里没有使用bl,也就意味着,永远不会执行后面的代码。


需要说明的是,s3c2440有好几个运行模式,不同的模式下有各自独立的堆栈指针寄存器,需要分别设置。目前我们只工作在默认的SVC模式下,也只是设置了该模式下的堆栈而已。


有了堆栈,C语言的函数就可以顺利执行,有了C语言,谁还会用汇编呢?所以后面是用C语言写的一个LED流水灯程序。


void Main(void)

{

    led_init();


    while(1){

        int i=0;

        for(i=1; i<=4; i++) {

            led_off( i-1 < 1 ? 4 : i-1);

            led_on(i);

            delay(10000);

        }

    }

}


2 编译说明

详见Makefile文件。


3 运行说明

参加TQ2440开发板学习纪实(1)—最简单的独立运行汇编程序中的说明。

推荐阅读

史海拾趣

Calex Mfg Co Inc公司的发展小趣事

在国内市场取得一定成绩后,Calex Mfg. Co., Inc.开始积极拓展海外市场。公司制定了全球化战略,通过参加国际展会、建立海外销售网络等方式,不断开拓国际市场。同时,公司还根据不同地区的市场需求,推出定制化的产品和服务,进一步提升了其在国际市场中的竞争力。

High Energy Corp公司的发展小趣事

Calex Mfg. Co., Inc.的创业之路并非一帆风顺。在创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,公司的创始人们凭借着对电子行业的热爱和对技术的深刻理解,坚持研发创新,不断推出符合市场需求的产品。他们通过精益求精的制造工艺和严格的质量控制,逐渐在市场中树立起了良好的口碑。

Ememory Technology Inc公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,eMemory始终保持着对新技术和新市场的敏锐洞察力。公司不断推出新的硅智财产品和解决方案,以满足客户不断变化的需求。同时,eMemory还积极拓展国际市场,与全球多家知名芯片设计厂商建立了长期稳定的合作关系。这些努力使得eMemory在电子行业中保持着领先地位,并为其未来的发展奠定了坚实的基础。

Global Mixed-Mode Technology Inc公司的发展小趣事
三相缺相报警灯电路的工作原理基于三相电的平衡性。当三相电中的任意一相缺失时,会导致电路不平衡,从而触发报警机制。通常,该电路会使用中间继电器或专门的缺相检测芯片来监测三相电的电压情况。一旦检测到缺相,就会通过继电器或芯片的控制,使报警灯亮起或发出声音警报,以提醒用户及时处理。
Aplus Integrated Circuits公司的发展小趣事

为了保持技术领先地位,Aplus Integrated Circuits公司注重产学研合作。公司与多所高校和研究机构建立了紧密的合作关系,共同开展科研项目和技术攻关。这种合作模式不仅为公司带来了源源不断的技术创新动力,还为公司培养了一批高素质的研发人才。

Danube Enterprise Co Ltd公司的发展小趣事

随着数字技术的快速发展,Danube也紧跟时代步伐,积极推进数字化转型。他们引入了先进的生产管理系统和供应链管理系统,实现了生产流程的自动化和智能化。同时,Danube还加强了与互联网企业的合作,利用大数据、云计算等技术手段提升产品的智能化水平。这些努力让Danube在电子行业中保持了领先地位,并引领了行业变革的方向。随着数字化转型的深入推进,Danube的未来发展将更加值得期待。

问答坊 | AI 解惑

8位、32位MCU整体研发成本比较

前言:在多数的微控器(MCU)应用中「成本」向来被视为第一设计要则,因此许多工程师倾向(或被要求)使用初阶MCU来精省成本,然这仅是精省了量产时的硬件料件成本,若从整体成本的角度来审视,结果往往会适得其反。 过去,微控器(MCU)的应用设计相 ...…

查看全部问答>

Protel DXP2004 简体中文破解版

Altium Protel DXP是第一套完整的板卡级设计系统,真正实现在单个应用程序中的集成。设计从一开始的目的就是为了支持整个设计过程,Protel DXP让你可以选择最适当的设计途径来按你想要的方式工作。Protel DXP PCB线路图设计系统完全利用了Windows X ...…

查看全部问答>

求助:电烙铁故障问题

开始用的时候可以,但是时间久了就不送锡了。 而且等锡融化时,把电烙铁头插入锡中,锡还保持着融合状态。 不知大家有没有好的办法解决?…

查看全部问答>

RS485通讯

  谁知道RS485通讯的详细资料???现在急用,谢谢!!!…

查看全部问答>

这个钟不错

http://www.tudou.com/programs/view/2dcGxif077E…

查看全部问答>

“全才”更有助于职业发展?

37岁的爱德格•卡梅兹(Edgar Camez)是一名工程师,在密歇根州迪尔伯恩(Dearborn)的福特设计中心(Ford Design Center)工作时,他成为了一名为汽车设计发动机支架的专才。但在工作了11年后他希望能做点不同的事,他感到自己的小圈子限制了自 ...…

查看全部问答>

DE2_WEB 哪位大侠用过DE2_WEB这个程序?

我在网上下了一个DE2_WEB的程序,用NIOSII编译不能用过,说是dm9000.c里边有错误,不知道啥原因?…

查看全部问答>

欢迎拍砖!大家看看这个布局,给点意见!!!

欢迎拍砖!大家看看这个布局,给点意见!!!…

查看全部问答>

定时器的结构中的TIM_ClockDivision

TIM_ClockDivision,查资料说这个函数设置了时钟分割,到底是什么意思啊??求大神讲讲…

查看全部问答>