STM32
直播中

刘晓寰

7年用户 207经验值
私信 关注
[问答]

为什么我试玩uCOS-II每次只进行一次任务调度就跑死了?

试玩了下uCOS-II ,但是不晓得是什么原因,每次都只进行一次任务调度就跑死了,希望指点一下~~~~~~~~~~
#include "includes.h"  

//设置任务堆栈大小
#define LED_STK_SIZE     64
#define KEY_STK_SIZE     64
#define START_STK_SIZE   128
//设置任务优先级
#define LED_TASK_Prio      6
#define KEY_TASK_Prio       5
#define START_TASK_Prio     14
//任务堆栈
OS_STK  TASK_KEY_STK[KEY_STK_SIZE];
OS_STK  TASK_LED_STK[LED_STK_SIZE];
OS_STK  TASK_START_STK[START_STK_SIZE];
OS_EVENT *Sem;//定义信号量指针
//任务申明
void TaskStart(void *pdata);
void TaskLed(void *pdata);
void TaskKEY(void *pdata);
//系统时钟配置函数
void Systick_Configuration(void);
      
int main(void)
{        
OSInit();
OSTaskCreate( TaskStart, //task pointer
     (void *)0, //parameter
     (OS_STK *)&TASK_START_STK[START_STK_SIZE-1], //task stack top pointer
     START_TASK_Prio ); //task priority
OSStart();
return 0;   
}
//开始任务
void TaskStart(void * pdata)
{
pdata = pdata;
STM32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化
uart_init(72,9600);  //串口初始化为9600
LED_Init();      //初始化与LED连接的硬件接口  
KEY_Init();
LED0=1;
LED1=1;
SysTick_Configuration();
OS_ENTER_CRITICAL();   //关中断
OSStatInit();  
OSTaskCreate(TaskKEY, (void * )0, (OS_STK *)&TASK_KEY_STK[KEY_STK_SIZE-1], KEY_TASK_Prio);

OSTaskSuspend(OS_PRIO_SELF); //挂起任务本身
//OSTaskDel(OS_PRIO_SELF); //删除任务本身
OS_EXIT_CRITICAL();  //开中断
}
//控制DS0的亮灭.
void TaskLed(void *pdata)
{
//    INT8U err;
   pdata = pdata;
// while(1)
//{
     OSSchedLock();   //禁止任务调度
  //OSSemPend(Sem,0,&err); //等待信号量
  LED0=0;
// OSTimeDly(100);
  OSTaskDel(OS_PRIO_SELF); //删除任务本身
// OSTimeDlyResume(KEY_TASK_Prio);//取消任务延时
     OSSchedUnlock(); //开锁
//}
   
}
//按键任务.
void TaskKEY(void *pdata)
{
INT8U key;
pdata = pdata;   
while(1)
{   
     OSSchedLock();   //禁止任务调度
     key=KEY_Scan();
  LED0=1;
  if(key==1)
  {
      key=0;
   OSTaskCreate(TaskLed, (void * )0, (OS_STK *)&TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio);
     // Sem=OSSemCreate(0);//创建信号量
  // OSSemPost(Sem);//发送信号量
  // OSTimeDly(100);
  }
  LED1=!LED1;
  OSTimeDly(100);
// OSTimeDlyHMSM(0,0,0,100);
     OSSchedUnlock(); //开锁
                  
   
}
  
}
   
//系统时钟中断服务函数
void SysTick_Handler(void)
{
OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR  */
    OSIntNesting++;
    OS_EXIT_CRITICAL();
    OSTimeTick();        /* Call uC/OS-II's OSTimeTick()               */
    OSIntExit();         /* Tell uC/OS-II that we are leaving the ISR  */
}
//系统时钟配置,设计1ms产生一次中断
void SysTick_Configuration(void)
{
  SysTick->CTRL&=~(1<<2);//SYSTICK使用外部时钟源
SysTick->CTRL|=1<<1;   //开启SYSTICK中断
SysTick->LOAD=9000;    //产生1ms中断
//bit2清空,选择外部时钟  HCLK/8
MY_NVIC_Init(3,3,SystemHandler_SysTick,2);//组2,最低优先级
SysTick->CTRL|=1<<0;   //开启SYSTICK
}
                                                                                                                                                                                                                                                                                       

回帖(4)

陈秀珍

2019-7-5 09:03:43
时钟配置应该放到OS初始化之前吧.
举报

王东

2019-7-5 09:20:48
呵呵,貌似也没啥反应,看来uCOS-II的路还肯蛮漫长的啊
举报

王林

2019-7-5 09:36:06
呵呵,直接用我们的模板吧.
举报

h1654155275.5697

2019-7-5 09:51:54
呵呵,原子哥,有改良版的模板不,分享下下啊
举报

更多回帖

发帖
×
20
完善资料,
赚取积分