📄 interrupt.c
字号:
#include "intLib.h"
#include "vxWorks.h"
#include "stdio.h"
#include "stdlib.h"
#include "semLib.h"
#include "taskLib.h"
#include "sysLib.h"
#include "tickLib.h"
#include "eventLib.h"
#include "msgQLib.h"
#define MAX_MSGS (10) /* 消息队列长度 */
#define MAX_MSG_LEN (100) /* 消息队列中消息的最大长度 */
#define SYSCLK_TICK 10 /* 系统时钟每秒的tick数 */
#define NO_ARG 0 /* 传递给函数的参数 */
#define STACK_SIZE 20000 /* 分配给每个任务的堆栈大小 */
static VOIDFUNCPTR *vector;
static FUNCPTR old_handler;
void softtimer(void);
void timer1(void);
void timer2(void);
void cosmos(void);
int tidSoftTimer,tidTimer1,tidTimer2;
int sysClkOringnalRate = 60; /* 系统时钟的原始ISR */
int T=0,T1=0,T2=0,pt1=0,pt2=0,T3=0; /*timer*/
int timer[10]={0};
SEM_ID semIdEventSender1,semIdEventSender2; /* 信号量资源ID,用来发送事件*/
MSG_Q_ID msgQueueId1,msgQueueId2;
char message1[]="T1\n";
char message2[]="T2\n";
void PWM_Timer(void)
{
semIdEventSender1 = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
semIdEventSender2 = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
msgQueueId1 = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY);
msgQueueId2 = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY);
sysClkOringnalRate = sysClkRateGet();
printf("\n system clock original rate = %d", sysClkOringnalRate);
if (sysClkRateSet(SYSCLK_TICK) == ERROR)
{
printf("\n System clock rate setting failure!");
}
if (sysClkConnect((FUNCPTR)cosmos, NO_ARG) == ERROR)
{
printf("\n System clock ISR connecting failure!");
}
sysClkEnable();
tidTimer1 = taskSpawn("Timer1", 205, 0, STACK_SIZE,
(FUNCPTR) timer1,0,0,0,0,0,0,0,0,0,0);
tidTimer2 = taskSpawn("Timer2", 200, 0, STACK_SIZE,
(FUNCPTR) timer2,0,0,0,0,0,0,0,0,0,0);
}
/******************************************************************
* cosmos - 系统时钟服务程序
*
* RETURNS: N/A
*/
void cosmos(void)
{
T++;
if(T-timer[1]>9){
timer[1]=T;
if(msgQSend(msgQueueId1,message1,sizeof(message1),NO_WAIT,MSG_PRI_NORMAL)==ERROR)
logMsg("failed\n");
semGive(semIdEventSender1);
}
if(T-timer[2]>49){
timer[2]=T;
if(msgQSend(msgQueueId2,message2,sizeof(message2),NO_WAIT,MSG_PRI_NORMAL)==ERROR)
logMsg("failed\n");
semGive(semIdEventSender2);
}
}
void timer1(void)
{
int result;
char messageBuf[100];
result = semEvStart(semIdEventSender1, VXEV01,
EVENTS_OPTIONS_NONE);
if (result == OK)
{
logMsg("\ntEventReceiver: semEvStart1() succ!\n");
}
else
{
logMsg("\ntEventReceiver: semEvStart1() failed!\n");
}
FOREVER{
memset(messageBuf, 0, 100);
if(msgQReceive(msgQueueId1,messageBuf,100,WAIT_FOREVER)==ERROR)
logMsg("msgQReceive in T1 failed.\n");
else logMsg("%s\n",messageBuf);
semTake(semIdEventSender1, WAIT_FOREVER);
T1=timer[1];
logMsg("Get it!!! T1 is %d \n",T1);
}
}
void timer2(void)
{
int result;
char messageBuf[100];
result = semEvStart(semIdEventSender2, VXEV01,
EVENTS_OPTIONS_NONE);
if (result == OK)
{
logMsg("\ntEventReceiver: semEvStart2() succ!\n");
}
else
{
logMsg("\ntEventReceiver: semEvStart2() failed!\n");
}
FOREVER{
memset(messageBuf, 0, 100);
if(msgQReceive(msgQueueId2,messageBuf,100,WAIT_FOREVER)==ERROR)
logMsg("msgQReceive in T2 failed.\n");
else logMsg("%s\n",messageBuf);
semTake(semIdEventSender2, WAIT_FOREVER);
T2=timer[2];
logMsg("Get it!!! T2 is %d \n",T2);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -