天嵌 ARM开发社区

 找回密码
 注册
查看: 2352|回复: 4

2440下获得PWM中断失败.IST无法进入

[复制链接]
postulate5 发表于 2012-12-19 13:16:29 | 显示全部楼层 |阅读模式
程序希望在CE下利用tq2440的PWM产生定时中断,然后做IST,然后发现没办法进入。
调试下发现的问题是...似乎是有什么把我的PWM的中断给mask掉了,就好像有另一个IST(或者ISR?)在我的IST运行之前把中断先给处理掉了,求解....

程序如下,里面PWM模块是正常的,InterruptInitialize等也是正常的,主线程里有一个循环,每次会输出Timer的计数器值,Mask状态,并重新Unmask一下。输出在程序后面。

//Trig And Wait Part: Global Varibles
HANDLE hBgEve;
HANDLE IntEvent;
UINT32 IRQ,g_KeySysIntr;

bool InitTrigAndWait()
{
    //Trig And Wait Part: Initialization
    IntEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (!IntEvent)
    {
        printf("failed to create event.\n");
        return FALSE;
    }
    IRQ = IRQ_TIMER1; //IRQ_Timer1;
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr, sizeof(UINT32), NULL))
    {
        printf("Fail to request sysintr value.\n");
        return FALSE;
    }
    if (!InterruptInitialize(g_KeySysIntr, IntEvent, NULL, 0))
    {
        printf("Fail to initialize.\n");
        return FALSE;
    }
    printf("Thread Init.\nIRQ:%d, g_KeySysIntr:%d.\n",IRQ,g_KeySysIntr);
    return true;
}

bool timing_main(func_t f)
{
    //pwm Init Part
    pwmInit();pwmSet(1,249,3,12500,100);
    pwmStop(1);

    //Trig And Wait Part: Initialization
    if (!InitTrigAndWait()) return false;

    //prepare Thread.
    HANDLE hGMIntr=CreateThread(NULL,0,GiveMeIntr,NULL,0,NULL);
    printf("Thread Priority: %d\n",CeGetThreadPriority(hGMIntr));
    if (!CeSetThreadPriority(hGMIntr,4))  {printf("Changing Priority of the IST Failed.\n");}
    else printf("Thread Priority: %d\n",CeGetThreadPriority(hGMIntr));
    SetEvent(hBgEve);

    //Interrupt Enable part
    if (!InitIntr()) return false;
    IntrUnMsk(IRQ_TIMER1);
    IntCheck(IRQ_TIMER1);
    printf("Intterrupt Enable Finished.\n");
   
    //Trig And Wait Part: Main Interface;
    pwmStart(1);pwmShow(1);
    printf("\n");
   
    //showing...
    for (uint s=0;s<30;s++)
    {
        printf("Value:%d.\n",pwmObserve(1));
        IntrMskShow(IRQ_TIMER1);
        IntrUnMsk(IRQ_TIMER1);
    }
    //clean up activity
    pwmStop(1);
    CloseHandle(hBgEve);
    return true;
}

DWORD WINAPI GiveMeIntr(LPVOID aaaa)
{
    WaitForSingleObject(hBgEve,INFINITE);
    printf("\"GiveMeIntr\"Inited!.\n");
    uint count=0;
    while (1)
    {
        WaitForSingleObject(IntEvent,INFINITE);
        printf("PWM Trigged! NO.%d\n",count);count++;
        InterruptDone(g_KeySysIntr);
    }
    return 0;
}

输出:
Thread Init.
IRQ:11, g_KeySysIntr:42.
Thread Priority: 251
"GiveMeIntr"Inited!
Thread Priority: 4
No request from 11.
Not masked at 11.
No pending from 11.
Intterrupt Enable Finished.
SettingInfo of Timer1
....此处Timer1信息略过,

Value:195.
11 is Masked.
Value:10452.
Not Masked at 11.
Value:8241.
Not Masked at 11.
...
Value:744.
11 is Masked.
Value:10943.
Not Masked at 11.
...

求指导! 上午在CSDN也发了个帖子,改了改也来这里问问...小修改了贴在CSDN的那个帖子的程序,从输出可以看出Unmask函数时可以用的,因为是先取Value再取mask,被Mask时的Value都是每次最后取到的一个值,这样看那个"幽灵ISR/IST"应该清楚多了...
问题就是,那个处理掉我的PWM中断的是什么啊!...已经把自己的IST的优先级调到很高了啊应该....


embedsky_lhh 发表于 2012-12-19 15:06:34 | 显示全部楼层
你看下芯片手册,把中断设置的相关寄存器的值显示出来试试
 楼主| postulate5 发表于 2012-12-19 15:41:36 | 显示全部楼层
embedsky_lhh 发表于 2012-12-19 15:06
你看下芯片手册,把中断设置的相关寄存器的值显示出来试试

要查什么么?...Mask信息已经显示了的,IntrMskShow里面是:
if (BT_CHK(pIntr->intmsk,n)) printf("%d is Masked.\n",n); else printf("Not Masked at %d.\n",n);
其中 #define BT_CHK(s,b) ((s)&(1<<(b)))

现在的问题是不知道为什么没有办法调到自己的IST...每次中断了就被Mask的一种可能是这是ISR里面的操作,但是不知道为什么系统在之后没有触发IST...很纠结...
embedsky_lhh 发表于 2012-12-19 15:46:15 | 显示全部楼层
那你去OEMIntrhandle里边捕获下有没有物理中断触发不久知道了
 楼主| postulate5 发表于 2012-12-19 23:23:40 | 显示全部楼层
embedsky_lhh 发表于 2012-12-19 15:46
那你去OEMIntrhandle里边捕获下有没有物理中断触发不久知道了

怎么捕获??...求问
又,OEMIntrhandle里面会调一个NKCallIntChain的函数,如果返回是SYSINTR_CHAIN就会把中断屏蔽掉,我想在应用里调用NKCallIntChain看看返回值,也加了Nkintr.h作头文件,结果EVC里编译没问题,但Build时会出现LinkError,找不到那个函数....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-28 01:41 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表