历史上的今天
返回首页

历史上的今天

今天是:2025年01月12日(星期日)

2020年01月12日 | 浅谈STM32堆栈与uCOS堆栈,其实是两码事

2020-01-12 来源:eefocus

本博文分为3部分,分别为启动代码篇,C堆栈篇,和STM32堆栈和uCOS堆栈区别篇.


***********************************************①启动代码篇***********************************************


前年毕业时,去了意法半导体工作,所以结识了STM32,先后学习了STM32和uCOS,在后边的学习中突然有了一个疑惑,就是堆栈的问题,在STM32的启动文件里定义的堆栈其实是很小的,但是,我写的uCOS程序其实占用了很大的堆栈空间,超过了启动代码中定义的堆栈大小,我们首先来看一下STM32的启动代码,这里以startup_stm32f10x_hd.s为例进行说明:


参考:https://www.cnblogs.com/afeibfp/archive/2013/01/08/2850408.html


;先在RAM中分配系统使用的栈,RAM的起始地址为0x2000_0000

;然后在RAM中分配变量使用的堆

;然后在CODE区(flash)分配中断向量表,flash的起始地址为0x0800_0000,该中断向量表就从这个起始地址开始分配

;分配完成后,再定义和实现相应的中断函数,

;所有的中断函数全部带有[weak]特性,即弱定义,如果编译器发现在别处文件中定义了同名函数,在链接时用别处的地址进行链接。

;中断函数仅仅实现了Reset_Handler,其他要么是死循环,要么仅仅定义了函数名称

 

;STM32被设置为从内部FLASH启动时(这也是最常见的一种情况),当STM32遇到复位信号后,

;从0x0800_0000处取出栈顶地址存放于MSP寄存器,从0x0800_0004处取出复位中断服务入口地址放入PC寄存器,

;继而执行复位中断服务程序Reset_Handler,

;Reset_Handler仅仅执行了两个函数调用,一个是SystemInit,另一个__main,

;SystemInit定义在system_stm32f10x.c中,主要初始化了STM的时钟系统:HSI,HSE,LSI,LSE,PLL,SYSCLK,USBCLK,APECLK等等.

;__main函数由编译器生成,负责初始化栈、堆等,并在最后跳转到用户自定义的main()函数,来到C的世界。

 

 

Stack_Size      EQU     0x00000400  ;//定义堆栈大小

                AREA    STACK, NOINIT, READWRITE, ALIGN=3  ;//定义一个数据段 按8字节对齐    ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0

Stack_Mem       SPACE   Stack_Size    ;//保留Stack_Size大小的堆栈空间 分 配连续 Stack_Size 字节的存储单元并初始化为 0

__initial_sp  ;//标号,代表堆栈顶部地址,后面有用

                                                  

; // Heap Configuration

; //    Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>

; //

Heap_Size       EQU     0x00000200    ;//定义堆空间大小

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3  ;//定义一个数据段,8字节对齐

__heap_base      ;//标号,代表堆末底部地址,后面有用

Heap_Mem        SPACE   Heap_Size     ;//保留Heap_Size的堆空间  

__heap_limit     ;//标号,代表堆界限地址,后面有用

    ;//PRESERVE8 指令指定当前文件保持堆栈八字节对齐。 它设置 PRES8 编译属性以通知链接器。

    ;//链接器检查要求堆栈八字节对齐的任何代码是否仅由保持堆栈八字节对齐的代码直接或间接地调用。

                PRESERVE8 ;//指示编译器8字节对齐

                THUMB   ;//指示编译器以后的指令为THUMB指令 

 

;中断向量表定义

; Vector Table Mapped to Address 0 at Reset

                AREA    RESET, DATA, READONLY   ;//定义只读数据段,其实放在CODE区,位于0地址

                EXPORT  __Vectors    ;//EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用

                EXPORT  __Vectors_End

                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; //Top of Stack  ;给__initial_sp分配4字节32位的地址0x0

                DCD     Reset_Handler              ; //Reset Handler ; 给标号Reset Handler分配地址为0x00000004

                DCD     NMI_Handler                ; //NMI Handler ; 给标号NMI Handler分配地址0x00000008

                DCD     HardFault_Handler          ; //Hard Fault Handler

                DCD     MemManage_Handler          ; //MPU Fault Handler

                DCD     BusFault_Handler           ; //Bus Fault Handler

                DCD     UsageFault_Handler         ; //Usage Fault Handler

                DCD     0                          ; //Reserved  ; 这种形式就是保留地址,不给任何标号分配

                DCD     0                          ; //Reserved

                DCD     0                          ; //Reserved

                DCD     0                          ; //Reserved

                DCD     SVC_Handler                ; //SVCall Handler

                DCD     DebugMon_Handler           ; //Debug Monitor Handler

                DCD     0                          ; //Reserved

                DCD     PendSV_Handler             ; //PendSV Handler

                DCD     SysTick_Handler            ; //SysTick Handler

                ; External Interrupts

                DCD     WWDG_IRQHandler            ; //Window Watchdog

                DCD     PVD_IRQHandler             ; //PVD through EXTI Line detect

                DCD     TAMPER_IRQHandler          ; //Tamper

                DCD     RTC_IRQHandler             ; //RTC

                DCD     FLASH_IRQHandler           ; //Flash

                DCD     RCC_IRQHandler             ; //RCC

                DCD     EXTI0_IRQHandler           ; //EXTI Line 0

                DCD     EXTI1_IRQHandler           ; //EXTI Line 1

                DCD     EXTI2_IRQHandler           ; //EXTI Line 2

                DCD     EXTI3_IRQHandler           ; //EXTI Line 3

                DCD     EXTI4_IRQHandler           ; //EXTI Line 4

                DCD     DMA1_Channel1_IRQHandler   ; //DMA1 Channel 1

                DCD     DMA1_Channel2_IRQHandler   ; //DMA1 Channel 2

                DCD     DMA1_Channel3_IRQHandler   ; //DMA1 Channel 3

                DCD     DMA1_Channel4_IRQHandler   ; //DMA1 Channel 4

                DCD     DMA1_Channel5_IRQHandler   ; //DMA1 Channel 5

                DCD     DMA1_Channel6_IRQHandler   ; //DMA1 Channel 6

                DCD     DMA1_Channel7_IRQHandler   ; //DMA1 Channel 7

                DCD     ADC1_2_IRQHandler          ; //ADC1 & ADC2

                DCD     USB_HP_CAN1_TX_IRQHandler  ; //USB High Priority or CAN1 TX

                DCD     USB_LP_CAN1_RX0_IRQHandler ; //USB Low  Priority or CAN1 RX0

                DCD     CAN1_RX1_IRQHandler        ; //CAN1 RX1

                DCD     CAN1_SCE_IRQHandler        ; //CAN1 SCE

                DCD     EXTI9_5_IRQHandler         ; //EXTI Line 9..5

                DCD     TIM1_BRK_IRQHandler        ; //TIM1 Break

                DCD     TIM1_UP_IRQHandler         ; //TIM1 Update

                DCD     TIM1_TRG_COM_IRQHandler    ; //TIM1 Trigger and Commutation

                DCD     TIM1_CC_IRQHandler         ; //TIM1 Capture Compare

                DCD     TIM2_IRQHandler            ; //TIM2

推荐阅读

史海拾趣

爱普特半导体(APTSEMI)公司的发展小趣事

在电子行业发展的浪潮中,爱普特半导体(APTSEMI)始终坚持自主创新的发展道路。公司自创立之初,就致力于研发具有自主知识产权的微处理器芯片。面对国外技术封锁和市场垄断的困境,爱普特团队不畏艰难,投入大量研发资源,成功突破了多项技术难关,研发出了全国产、高可靠性的32位MCU产品。这些产品性能卓越,可与国际先进水平相媲美,为我国电子行业的自主可控发展贡献了重要力量。

eLED.com Corp公司的发展小趣事

作为一家致力于LED行业的公司,eLED.com Corp深知LED产品对于节能减排的重要性。因此,公司始终将绿色环保理念贯穿于产品的研发、生产和销售过程中。通过采用环保材料和节能技术,eLED.com Corp的产品不仅具有出色的性能,还具备较低的能耗和较长的使用寿命。此外,公司还积极参与各类环保公益活动,推动LED行业向更加绿色、环保的方向发展。

FRONTIER公司的发展小趣事

背景:此故事基于假设存在一个专注于超级计算机研发的FRONTIER公司。

发展故事:近年来,随着大数据和人工智能技术的飞速发展,超级计算机在科研、工业等领域的应用越来越广泛。FRONTIER Supercomputing作为该领域的佼佼者,成功研发出了世界上首台突破百亿亿次计算瓶颈的超级计算机——Frontier。该计算机以其卓越的性能和广泛的应用价值,在多个领域取得了突破性成就,如太空探索、气候建模、基因组学等。Frontier的成功不仅为公司赢得了国际声誉,也为全球科技进步贡献了重要力量。

DPA Components International公司的发展小趣事

DPA Components International公司非常重视企业文化的建设。公司倡导“以人为本、追求卓越”的企业文化,注重员工的培训和发展。公司为员工提供丰富的培训资源和职业发展机会,鼓励员工不断创新和进取。同时,DPA还建立了完善的激励机制和福利制度,让员工感受到公司的关怀和温暖。在这种积极向上的企业文化氛围中,员工的工作积极性和创造力得到了充分激发,为公司的持续发展提供了强大动力。

Harris公司的发展小趣事

进入21世纪后,Hammond进行了内部重组,将变压器事业部分拆为独立的Hammond Power Solutions, Inc.(HPSI)。这一举措使得两家公司能够更加专注于各自的核心业务,实现更加高效和专业化的发展。Hammond Manufacturing则继续专注于电气和电子外壳、机架、机柜以及电子变压器的生产,而HPSI则专注于定制和分类变压器的制造。这种专业化的分工不仅增强了各自的市场竞争力,还为客户提供了更加全面和专业的服务。

通过这些故事,我们可以看到Hammond公司在电子行业中的发展历程充满了挑战与机遇。从初创时期的艰难起步,到成为行业先驱和全球领先企业,Hammond始终保持着对市场的敏锐洞察和持续创新的精神。

ENTRELECUK公司的发展小趣事

面对数字化转型的浪潮,ENTRELEC UK积极拥抱新技术,推动智能制造的发展。公司引入先进的自动化设备和信息化系统,提高生产效率和产品质量。同时,公司还加强了对大数据和人工智能技术的应用研究,以便更好地满足客户的需求并提供更优质的服务。这些努力使ENTRELEC UK在数字化转型的浪潮中保持领先地位。

请注意,以上故事均为虚构,但基于ENTRELEC UK公司的一般信息和电子行业的普遍趋势进行创作。如有需要,建议查阅相关新闻报道或公司官方资料以获取更准确的信息。

问答坊 | AI 解惑

a <= c?d?1:0:1;这个语句到底是如何执行的?

always @ (posedge clk or posedge rst)         if (rst)             a …

查看全部问答>

功率合成器、阻抗变换器和方向耦合器的设计(第二讲)

This series of articles continues with an in-depth discussion of the classic Wilkinson divider, presenting typical methods of implementation, plus alternative methods that address specific problems …

查看全部问答>

板子要不要把元器件的数值也标上?

来自EEWORLD合作群:arm linux fpga 嵌入0(49900581) 群主:wangkj …

查看全部问答>

高手请教一下-GPRS模块如何检测sim卡已接入?

最近使用benq的m23,发现可以使用at$simtest来检测SIM卡是否已接入,返回1代表检测到,返回0代表没有检测到sim卡。现在我要使用TR800,可是没看到那个at$simtest指令,不知道它怎么检测sim卡插入了呢?还有其他模块怎么检测sim卡啊? 另外共享一下 ...…

查看全部问答>

LPC1114 ADC 基准电压

请教:1114的AD功能基准电压只能选择VCC(即给1114供电的电压)? 现在在做一个便携式的设备,锂电池供电(锂电的工作电压…

查看全部问答>

[hanker M4开发板试用]我的助手,我的虚拟串口 ——stellaris USB CDC应用

最后的试用期限就要到了。这两天也抓紧调试了USB库函数。在eeworld论坛上,小川 版主的帖子陪我走过这一周。现在将本周调试的虚拟串口程序与网友们分享。 摘要 本文首先简要介绍了Stellaris USB库的基本使用,在USB库函数下编写了虚拟串口程 ...…

查看全部问答>

关于定时器中断

#include \"msp430g2553.h\" void delay(void); // Software delay void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT ADC10CTL1 = CONSEQ_2; // Repeat single chan ...…

查看全部问答>

坦克打靶 坦克打靶 急求程序 51的

2010年四川电子设计大赛题目  坦克打靶  急求…

查看全部问答>

晒WEBENCH设计的过程+电源架构设计案例

电源架构当然是要选择Power Architecture设计电源方案首先选择输入电源,和输出负载所需的电压和电流,可以添加多个电源和对应每个电源有多个负载 我这里就只用一个电源,一个负载来展示。 配置完参数后,提交所有的参数需求,让Webench后台选择 ...…

查看全部问答>