在中断服务程序中翻转一个GPIO的输出状态,用示波器测量此GPIO的输出波形并且测量频率,这个是测量中断调用频度的。
如果要测量中断的处理时间,则可以在进入中断服务程序时设置GPIO状态,退出时再设回来,用示波器可测量执行时间。
尽管需要具体问题具体分析,还是有一些基本的规律的:
中断通常用于高优先级,高响应性,低频度业务,串口的接收就是一个典型
轮询通常用于低优先级,低响应性,高频度大数据量业务,键盘扫描是一个典型
但是这不是绝对的,通常情况是中断与轮询相配合,例如定时功能,在定时器中断里设置标志位,程序主任务里轮询该标志位,做具体 *** 作。键盘扫描也通常是外部中断记录按下了哪个键,轮询在做进一步的扫描处理(例如去抖功能)。
对于一楼的补充,轮询可能根本不需要 *** 作中断,故而不一定要置位/清零标志位
对于二楼的补充,不是所有的中断都需要外部管脚作为触发源,例如UART,USB都是如此
中断服务程序的入口地址注册,不同的系统都不一样的。
具体的方法在编译器的手册里面会有详细说明,不过这种语法说明看起来会比较费劲。
一个简单点的办法是先看看编译器提供的中断程序的例程,再去查编译手册。
首先,你离进入嵌入式还很遥远。因为下面的代码你竟然不懂。
其次。你这个Pxa是什么我不知道,也不去了解,只看代码。然后给你注释。
最后,如果你对我回答满意,请选我为最佳,并点顶。
#include "configh"
#define E_Interrupt 1<<0
以下5行是对位的控制。我猜测,1为使能,0为失能。
#define Beep (1<<11)
#define LED0 (1<<17)
#define LED1 (1<<18)
#define LED2 (1<<19)
#define LED3 (1<<20)
#define count 1625000
#define BeepOn() GPCR0=GPCR0 | Beep (这句话什么意思?)这句话意思是将GPCR0的第11位置为1也就是使能beep。GPCR0 我猜为GPIO的control寄存器1
#define BeepOff() GPSR0=GPSR0 | Beep
#define LedOn() GPCR2=GPCR2|LED0|LED1|LED2|LED3; (这句话什么意思)这句话的意思是将GPCR2的寄存器的17,18,19,20位置为1也就是使能led0led1led2led3
#define LedOff() GPSR2=GPSR2|LED0|LED1|LED2|LED3; 这句话就和上面是相反的作用,失能。也就是关闭的意思。
uint8 num;
问题2 :
void DelayNS(uint32 dly) 延时函数。
{
uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
void SystemInit() 系统初始化函数。
{
GPDR0=GPDR0 | Beep;//GP11 set as output
GAFR0_L=GAFR0_L & (0x00<<22);//GP0 set as GPIO
GPDR2=GPDR2|LED0|LED1|LED2|LED3;//配置GP81,82,83,84为输出
GAFR2_U=GAFR2_U&(~(0xff<<2));//配置GP81,82,83,84为GPIO
OSMR0=OSMR0 | count;
OIER=OIER | E_Interrupt;
UART_Init(115200); 串口初始化 频率为115200
}
void IRQ_EInit() 中断初始化。
{
num++;
OSSR = OSSR | E_Interrupt; 我猜OSSR为系统状态寄存器
OSCR0=OSCR0 & 0;
}
void EIntInit() 这段代码你需要了解ICMR ICLR,ICCR ,IPR0分别表示什么寄存器,另外寄存器ICMRICLR的第26位表示什么。
{
ICMR=ICMR | (0x01<<26);
ICLR=ICLR & (~(0x01<<26));
ICCR=ICCR & (~0x01);
IPR0=IPR0 | (26<<0) | (1<<31);
VICVectAddr[26]=(uint32) IRQ_EInit;
}
这短代码啥意思?
问题3:int main(void)
{
SystemInit(); 系统初始化
EIntInit(); 中断初始化
IRQEnable(); 中断使能
while(1) 无限循环
{
if(num==20)
{
BeepOn(); 使能BEEP
LedOn(); 使能LED灯
DelayNS(50); 延时50
LedOff() 关闭led灯
num=0; num重新计数
}
else
{
BeepOff(); 关闭beep
LedOff(); 关闭led灯
}
}
return 0;
}
32单片。嵌入式时钟在调用嵌入式时钟时被初始化为0,以后每发生1个时钟节拍OSTickCtr加1,节拍数在32单片中断服务程序函数被引用,引用的是SysTick定时器既能为 *** 作系统提供系统时钟节拍又能为delay函数作延时用。
中断:响应消息——每一个消息到来,就会给某一个变量的相应位置1,将新增的消息记录下来(ID |= 0x1;//将bit0置1 );
主程序:解析记录,然后分别处理每一位对应的消息,处理后将该位清零(ID &= (~0x1);//将bit0清0 )。
上述的 *** 作方法中,使用了逻辑运算符,转换为汇编语言时,只有1句的C语言代码变成了不止一句,这就给了中断影响主程序 *** 作同一变量的可乘之机。
下面给出一种解决方案,一种可以在主程序和中断 *** 作同一变量的方案(妈耶,终于点题了)!
使用数组的方法,让中断和主程序中对该变量的 *** 作,浓缩为只要一个指令周期就可以搞定的 *** 作。话不多说,上代码
全局变量:unsigned short bit[16] = {0};
中断: if(消息1 == 消息){ bit[0] = 1;}
主程序:if(bit[0] == 1) { //处理消息1; bit[0] = 0;}
上述的 *** 作方法中,只使用了赋值运算符,转换为汇编语言时,1句C语言代码也只变成了一句汇编代码,只需要一个指令周期的时间去执行,避免了中断影响主程序 *** 作同一变量的可乘之机。
以上就是关于如何测试嵌入式linux系统中断延迟时间全部的内容,包括:如何测试嵌入式linux系统中断延迟时间、嵌入式中“轮询法”和“中断法”如何应用、嵌入式开发,硬件的中断回调函数怎么注册等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)