|
用ARM裸机实现多任务
采用定时器0来产生一个时间片timer,1timer=1us
接着达到某个时间(timer的n倍)时某个任务执行
然后每个任务都这样等待某个时间后执行
定时器0产生中断,代码如下
- /*******************************************************************************************
- * 名 称:IRQ_Time0()
- * 功 能:定时器0中断服务程序,取反蜂鸣器控制口。
- * 入口参数:无
- * 出口参数:无
- ********************************************************************************************/
- void __irq IRQ_Timer0(void)
- {
- timer++;
- if(timer==10)timer=0; //将最小时间片清零,为一次作准备
- T0IR = 0x01; // 清除中断标志
- VICVectAddr = 0x00; // 通知VIC中断处理结束
- }
- /********************************************************************************************
- * 名 称:Time0Init()
- * 功 能:初始化定时器0,定时时间为1微秒(1us),并使能中断。
- * 入口参数:无
- * 出口参数:无
- *********************************************************************************************/
- void Time0Init(void)
- {
-
- /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
- Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
- */
- T0PR = 99; //设置定时器0分频为100分频,得110592Hz
- T0MCR = 0x03; //匹配通道0匹配中断并复位T0TC
- T0MR0 = 11; //比较值(1微秒定时值)
- T0TCR = 0x03; //启动并复位T0TC
- T0TCR = 0x01;
- //设置定时器0中断IRQ
- VICIntSelect = 0x00; //所有中断通道设置为IRQ中断
- VICVectCntl0 = 0x24; //定时器0中断通道分配最高优先级(向量控制器0)
- VICVectAddr0 = (uint32)IRQ_Timer0; //设置中断服务程序地址向量
- VICIntEnable = 1<<4; //使能定时器0中断
- }
- /****************************************************************************
- * 名称:main()
- ****************************************************************************/
- void main()
- {
- SysInit (); //系统初始化
- Time0Init(); //定时器0初始化
- while(1);
- {
- if(timer==8)Display();//某个任务,其他任务还没有加进来
- }
- }
复制代码
仿真出错了,出错提示如下
大家帮我看看!!!谢谢大家!!!!!!!!!
|
|