查看: 2554|回复: 2

[S12] XS128在同时使用PIT中断和SWI中断时出现ILLEGAL_BP

[复制链接]

该用户从未签到

2

主题

5

帖子

0

新手上路

Rank: 1

积分
20
最后登录
2016-2-19
发表于 2016-2-19 10:26:18 | 显示全部楼层 |阅读模式
在移植uCOSii到xs128单片机上的时候出现了这个问题,但是屏蔽掉PIT中断或者不使用SWI中断的时候程序能正常运行。
——————————————————————————————————————————————————
刚才又尝试了一下使用TIM定时,这次TIM和SWI同时使用也可以正常运行,不知道程序哪里除了问题,有没有大神能帮我看一下
我知道答案 目前已有2人回答
回复

使用道具 举报

该用户从未签到

2

主题

5

帖子

0

新手上路

Rank: 1

积分
20
最后登录
2016-2-19
 楼主| 发表于 2016-2-19 10:30:33 | 显示全部楼层
  1. static void MainTask(void *p_arg)
  2. {

  3.    (void) p_arg;              //转换成空指针,防止编译器错误
  4.   // INIT_PIT();
  5.    
  6.    AppTickInit();
  7.    EnableInterrupts;
  8.    while(TRUE)
  9.    {
  10.        LED=~LED;
  11.        a=a+1;
  12.        OSTimeDlyHMSM(0, 0, 1,0);
  13.      
  14.    }
  15. }




  16. void main(void) {
  17.    
  18.    
  19.     DisableInterrupts;
  20.     INIT_PLL();
  21.     INIT_LED();
  22.    
  23.     OSInit();
  24.                
  25.    
  26.   /*OSTaskCreate(  MainTask,
  27.                     (void *)0,
  28.                     &MainTaskStk[MAIN_TASK_STK_SIZE-1],
  29.                     MAIN_TASK_PRIO);*/
  30.     Sys_CreateTask(TASK_ID_MAIN, MainTask, 0);  //任务创建函数  返回值ret   
  31.                     
  32.   
  33.    
  34.    
  35.    
  36.    
  37.       
  38.     OSStart();        

  39. }
复制代码
  1. void INIT_PLL(void)
  2. {
  3.     CLKSEL &= 0x7f;       //set OSCCLK as sysclk
  4.     PLLCTL &= 0x8F;       //Disable PLL circuit
  5.     CRGINT &= 0xDF;
  6.    
  7.     #if(BUS_CLOCK == 40000000)
  8.       SYNR = 0x44;
  9.     #elif(BUS_CLOCK == 80000000)
  10.       SYNR = 0xC9;     
  11.     #elif(BUS_CLOCK == 24000000)
  12.       SYNR = 0x42;
  13.     #endif

  14.     REFDV = 0x81;          //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=80MHz ,fbus=40M
  15.     PLLCTL =PLLCTL|0x70;   //Enable PLL circuit
  16.     asm NOP;
  17.     asm NOP;
  18.     while(!(CRGFLG&0x08)); //PLLCLK is Locked already
  19.     CLKSEL |= 0x80;        //set PLLCLK as sysclk
  20.    
  21. }


  22. void INIT_PIT(void)
  23. {
  24.   PITCFLMT=0X00;   //禁用PIT模块
  25.   PITCE_PCE0=1;    //使能PIT定时器0通道
  26.   PITMUX=0X00;     //使用基准1计数
  27.   PITMTLD0=199;   //八位微定时器的模数递减计数器的装载初值 1
  28.   PITLD0=1999;   // 2 4dd  (4DD+1)(FF+1)/64M=1ms
  29.   PITINTE=0X01;    //允许PIT通道0中断请求。
  30.   PITCFLMT=0X80;   //使能PIT模块  
  31. }


  32. void INIT_LED(void)
  33. {
  34.   LED_dir=0xff;       //设置为输出
  35.   LED=0b10101010;          //点咩LED1

  36. }



  37. #define   OS_TICK_OC_CNTS  (BUS_CLOCK / OS_TICKS_PER_SEC)


  38. void AppTickInit (void)
  39. {

  40.     TSCR1   = 0x80;             //定时器使能位置位                        

  41.     TIOS  |= 0x80;              //7通道输出比较                                             
  42.     TC7    = TCNT + OS_TICK_OC_CNTS;
  43.     TCTL1  |= 0x40;             //OC7输出翻转                                               
  44.     TIE |= 0x80;                //使能通道7中断                  
  45.                                                                                                 


  46. } [code]void OSCtxSw(void)    //软中断服务子程序 实现用户级上下文切换,用汇编语言实现
  47. {
  48. __asm{
  49.     ldaa  $15                         ;restored ppage;
  50.     psha
  51.     ldx    OSTCBCur                   ;  3~, OSTCBCur->OSTCBStkPtr = Stack Pointer                     
  52.     sts    0,x                        ;  3~      
  53.     }
  54.    
  55. #if OS_CPU_HOOKS_EN > 0
  56.     OSTaskSwHook();         /* 4~, Invoke user defined context switch hook */                                         
  57. #endif
  58.                        
  59. __asm{   
  60.     ldx    OSTCBHighRdy               ;  3~, OSTCBCur  = OSTCBHighRdy
  61.     stx    OSTCBCur                   ;  3~                        
  62.     ldab   OSPrioHighRdy              ;  3~, OSPrioCur = OSPrioHighRdy                        
  63.     stab   OSPrioCur                  ;  3~
  64.     ldx    OSTCBCur
  65.     lds    0,x                        ;3~, Load SP into 68HC12
  66.     pula                              ;use ppage
  67.     staa  $15                           
  68.     nop                                 
  69.         }
  70. }  
  71. [code]/* use these definitions in plane of the vector table ('vectors') above */
  72. VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */
  73. VECTOR 4   OSCtxSw
  74. VECTOR 15  OSTickISR
  75. VECTOR 66  PIT_ISR
复制代码
[/code]
[/code]
  1.   OSTickISR:
  2.     ldaa   PPAGE                       ;  3~, Get current value of PPAGE register                                
  3.     psha                               ;  2~, Push PPAGE register onto current task's stack

  4.     inc    OSIntNesting                ;  4~, Notify uC/OS-II about ISR

  5.     ldab   OSIntNesting                ;  4~, if (OSIntNesting == 1) {   
  6.     cmpb   #$01                        ;  2~
  7.     bne    OSTickISR1                  ;  3~

  8.     ldy    OSTCBCur                    ;  3~,     OSTCBCur->OSTCBStkPtr = Stack Pointer     
  9.     sts    0,y                         ;  3~, }                                          

  10. OSTickISR1:
  11.     call   OSTickISR_Handler

  12. ;   cli                                ;  2~, Enable interrupts to allow interrupt nesting
  13.       
  14.     call   OSIntExit                   ;  6~+, Notify uC/OS-II about end of ISR
  15.    
  16.     pula                               ;  3~, Get value of PPAGE register
  17.     staa   PPAGE                       ;  3~, Store into CPU's PPAGE register                                
  18.         
  19.     rti                                ;  12~, Return from interrupt, no higher priority tasks ready.
  20. ULONG  g_SysTick;
  21. void  OSTickISR_Handler (void)
  22. {

  23.     TFLG1 |= 0x80;                                                       /* Clear interrupt                                          */
  24.     TC7   += OS_TICK_OC_CNTS;                                                /* Set TC7 to present time + OS_TICK_OC_CNTS                */
  25.    
  26.     g_SysTick++;
  27.    
  28.     OSTimeTick();                                                       /* Inform the OS about the Time Tick                        */
  29. }
  30.       
  31. void PIT_ISR(void){   
  32.    
  33.     OSIntEnter();

  34.     asm cli;
  35.       
  36.     PITTF_PTF0=1;
  37.     OSTimeTick();      /*  Call uC/OS-II's OSTimeTick()*/
  38.     //g_SysTick++;

  39.     OSIntExit();   
  40. }
复制代码

pit定时器使用出问题.rar

786.7 KB, 下载次数: 0, 下载积分: 威望 1

回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2016-2-19 11:15:26 | 显示全部楼层
非常感谢你的技术问题。非常抱歉中国没有16位单片机方面的技术专家。请您在飞思卡尔的英文论坛提交请求。网址是http://community.freescale.com/welcome 谢谢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-12 09:55 , Processed in 0.091946 second(s), 24 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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