|
程序希望在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的优先级调到很高了啊应该....
|
|