OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5756|回复: 4

请问是怎么回事(求高手指点)

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-4-26
在线时间
0 小时
发表于 2014-5-6 12:44:47 | 显示全部楼层 |阅读模式
5金钱
 #include"stm32f10x.h"
 #include "ucos_ii.h"
 #include"app_cfg.h"

extern   void LED_Init(void );
/***函数声明区域*/



 /**********声明创建任务堆栈*******/
static OS_STK   startup_task_stk[STARTUP_TASK_STK_SIZE];
static OS_STK   test1_task[test_task_SIZE];

static void test_task(void   *p_arg);
static void systick_init(void)
{

  RCC_ClocksTypeDef rcc_clocks;
  RCC_GetClocksFreq(&rcc_clocks);
  SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);

}



static void startup_task(void *p_arg)
{

  systick_init(); /* Initialize the SysTick. */


OSStatInit(); /* Determine CPU capacity. */


 
   /*********此处添加用户需要的任务函数**************/
  OSTaskCreate(test_task,(void*)0,&test1_task[test_task_SIZE-1],test_task_PRIO);

  OSTaskDel(OS_PRIO_SELF);


}

 int main(void)
 {
 while(1)
 {
      OSInit();
 
  OSTaskCreate(startup_task,(void*)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO);
 
OSStart();

 }
 }
static void test_task(void*p_arg)
{



 while(1)
 {
 
    GPIO_SetBits(GPIOB,GPIO_Pin_0);
 }

}



任务跑不起来!!!1

最佳答案

查看完整内容[请看2#楼]

你干吗把main里面建立个while(1)在那跑啊 int main()  { 初始化时钟; OSInit();   OS_ENTER_CRITICAL();//建立任务前关闭终端 OSTaskCreate(TASK1,(void*)0,(OS_STK*)&TASK1_STK[TASK_STK_SIZE-1],1); OSTaskCreate(TASK2,(void*)0,(OS_STK*)&TASK2_STK[TASK_STK_SIZE-1],3);   OS_EXIT_CRITICAL(); OSStart(); return 0; } void TASK1(void *data) {     在第 ...
凡事都要认真。用心。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2014-5-6 12:44:48 | 显示全部楼层
你干吗把main里面建立个while(1)在那跑啊

int main()
 {

初始化时钟;
OSInit();
  OS_ENTER_CRITICAL();//建立任务前关闭终端
OSTaskCreate(TASK1,(void*)0,(OS_STK*)&TASK1_STK[TASK_STK_SIZE-1],1);
OSTaskCreate(TASK2,(void*)0,(OS_STK*)&TASK2_STK[TASK_STK_SIZE-1],3);
  OS_EXIT_CRITICAL();
OSStart();
return 0;
}

void TASK1(void *data)
{
    在第一个任务启动节拍服务;
    while(1){}
}
void TASK1(void *data)
{
    while(1){}
}
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-6 12:53:43 | 显示全部楼层
你的OSStart();这个函数怎么跑到while里面去了呢
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2014-5-6 13:07:40 | 显示全部楼层
你看原子的例程

int main(void)
{     
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化
LED_Init();
LED_Init();     //初始化与LED连接的硬件接口
OSInit();   
  OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();     
}

  
//开始任务
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
pdata = pdata; 
   OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)    
  OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);    
  OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);      
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}

//LED0任务
void led0_task(void *pdata)
{  
while(1)
{
LED0=0;
delay_ms(80);
LED0=1;
delay_ms(920);
};
}

//LED1任务
void led1_task(void *pdata)
{   
while(1)
{
LED1=0;
delay_ms(300);
LED1=1;
delay_ms(300);
};
}
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-4-26
在线时间
0 小时
 楼主| 发表于 2014-5-6 18:55:31 | 显示全部楼层
小细节,没有注意到!!我是新手,才开始学。估计就是主函数 的那个while(1){}.被OSSTAR()误导了,它说这个函数永不返回,我就错误的认为没有回到主函数了。。。谢谢你。困扰我1天了。再次感谢!
凡事都要认真。用心。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-10 12:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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