如何测试嵌入式linux系统中断延迟时间

如何测试嵌入式linux系统中断延迟时间,第1张

在中断服务程序中翻转一个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系统中断延迟时间、嵌入式中“轮询法”和“中断法”如何应用、嵌入式开发,硬件的中断回调函数怎么注册等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9436625.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存