前天遇到了中断里面开不了数组的问题,经验证果然是堆栈内存的问题,然后经过我查资料,终于找到了编译文件里面的一个.map文件
里面就是内存分配的表格,部分如下:
SECTION START END SIZE ALIGN
R
00002100 00002453 354 4
SU
00002454 00002753 300 4
SI
00002754 00002853 100 4
可以看到其中SI是中断堆栈,SU是用户数据堆栈。中断堆栈只有100(16进制)字节的大小。这个大小其实也不小了,但是如果开大的数组的话还是不够的,因为中断启动后本身会占用一些(我猜测),但是sprintf函数居然有100都不够,确实让我惊讶。我之后开到了800,问题立刻解决了。sprintf可以用了,开数组开到1000大小都没问题。
我用的是瑞萨的单片机,HEW开发环境,它里面想要对堆栈操作,我目前发现可以有两个半办法。一是在新建工程时有提示,二是里面有个stacksct.h的头文件可以设置。然后还有半个办法是里面在编译选项里面有个对堆栈地址顺序的调整,不能调整大小,但能调整地址值。
准确的说中断数据是SI栈,栈向上增长,会碰到SU用户数据,导致数据冲突,程序乱飞。我开始时只找到了调整地址值的方法,将SI移到了SU上面,结果也暂时解决了冲突的问题,可是之后在执行程序时,有地方出现了bug,看来是冲突到了R。
但是旧的问题解决了,新的问题出来了。
关于uip这个tcp建议协议的问题。
关键字:中断 开数组 sprintf函数
引用地址:
中断里面开数组以及sprintf函数的解决办法
推荐阅读最新更新时间:2024-03-16 16:20
STM32串口USART1中断接收和中断发送
先贴出中断函数: view plain copy void USART1_IRQHandler(void){ IF (USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART1, USART_IT_RXNE); USART1_Buffer =USART_ReceiveData(USART1); //USART1_Buffesh是一个自己定义的接收数组 if(i 3){ SendFlag = 1; } } if(USART_GetITStatus(USART1, USART_I
[单片机]
stm32 外部PB8中断
一、初始化该引脚时钟 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB ,ENABLE); 二、初始化该引脚为外部中断 void GPIO_Config_Init(void) { GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB8 dog_wake GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } 三、初始化外
[单片机]
51单片机中断响应过程举例
CPU响应 中断 时,首先把当前 指令 的下一条 指令 (就是 中断 返回后将要执行的指令)的地址送入堆栈,然后根据中断标记,将相应的中断入口地址送入PC,PC是程序指针,CPU取指令就根据PC中的值,PC中是什么值,就会到什么地方去取指令,所以程序就会转到中断入口处继续执行。这些工作都是由硬件来完成的,不必我们去考虑。这里还有个问题,大家是否注意到,每个中断向量地址只间隔了8个单元,如0003-000B,在如此少的空间中如何完成中断程序呢?很简单,你在中断处安排一个LJMP指令,不就可以把中断程序跳转到任何地方了吗? 一个完整的主程序看起来应该是这样的: 内容来自单片机之家www.dpj100.com ORG 0000H
[单片机]
关于51单片机扩展中断的四种方法
简介:MCS—51系列单片机内部只有两个外部中断源输入端,当外部中断源多于两个时,就必须进行扩展,下面介绍两种简单的扩展方法 一、采用硬件请求和软件查询的方法: 这种方法是:把各个中断源通过硬件“或非(高有效,如CD4002)”(与,低有效)门引入到单片机外部中断源输入端(INT0或INT1),同时再把外部中断源送到单片机的某个输入输出端口,这样当外部中断时,通过“或非”(与)门引起单片机中断,在中断服务程序中再通过软件查询,进而转相应的中断服务程序。显然,这种方法的中断优先级取决于软件查询的次序。其硬件连接和软件编程如下: Void zhongduan (void) interrupt 0 using 3 //中断函
[单片机]
STM32学习记录12 中断向量表
从stm32f10x.s可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如: AREA RESET, DATA, READONLY ; 定义只读数据段,实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000) EXPORT __Vectors IMPORT OS_CPU_SysTickHandler IMPORT OS_CPU_PendSVHandler __Vectors DCD __initial_sp ; Top of Stack DCD Reset_
[单片机]
Wince外部中断控制LED详解动态申请
本实例是基于S3C2440,WINCE5.0 1.中断分两大类:内部中断和外部中断。 外部中断:由外部设备所引发的中断,这些外部中断都是通过GPIO中的中断引脚产生的。S3C2440有24个外部中断,相关的寄存器如下: EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。 EINTFLT0-EINTFLT3:控制滤波时钟和滤波宽度。 EINTPEND:中断挂起寄存器 EINTMASK:中断屏蔽寄存器 内部中断:内部中断是有CPU内部器件产生的中断,如定时器中断,USB中断,UART中断等。相关的寄存器如下:
[单片机]
MAX3420E外设控制器的中断系统
MAX3420E可与任何SPI主控制器相连,以构成全速USB外设器件。尽管一般都由MAX3420来管理底层USB信令,但是需要处理USB事件时,SPI主控制器必须参与处理,当MAX3420的INT引脚指示有中断发生时,SPI主控制器将读取14个中断请求位,以确定需要服务的中断,一般情况下,主要由这些中断请求(IRQ)位确定MAX3420E的工作过程,在选择器件时,SPI主控制器可以是微控制器、DSP、ASIC或具备SPI端口的其他器件,并应能提供SCLK信号。
MAX3420E的中断逻辑
◇ IRQ位
图1所示为MAX3420E中断逻辑。阴影部分是可通过SPI访问的寄存器位,图中有一个IRQ位,实际上,每一个中断都有一个用
[传感技术]
PIC单片机多中断处理技术的应用与研究
引言 PIC系列单片机中断源已经达到14个.可谓相当丰富;但同时也带来了一些难题:在处理多中断时不具备处理“高级优先处理”能力的问题,如此多的中断源在处理时很容易产生中断冲突,如何有效的处理中断到达时的时序,其算法应该如何实现成了首先需要解决的问题。 1 中断处理技术 对于PIC系列单片机,其设计上虽然有很多中断,但是并没有规定中断的优先级。当遇到中断的时候,不做任何判断,而是先把指针指向0004H(中断起始地址),至于接下来如何操作则完全交给用户“软处理”完成。其中断时序图如下: 图1 INT引脚中断时序图 中断现场的保护是中断技术中一个很重要的环节。对于PICl6F87X单片机,在进人中断
[单片机]