OpenEdv-开源电子网

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

μC/OS-II问题

[复制链接]

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
发表于 2013-4-30 14:06:54 | 显示全部楼层 |阅读模式

////////////开始任务/////////////
void  StartTask(void *pdata)
{
   OS_CPU_SR cpu_sr=0;
   pdata=pdata;
   OS_ENTER_CRITICAL();//关闭中断(进入临界区)
   OSTaskCreate(
           Led0Task,//指向任务的指针
     (void*)0,//传递给任务的参数
     &Led0TaskStk[LED0_STK_SIZE-1],//指向堆栈栈顶
     LED0_TASK_PRIO  
   ); //创建LED0任务
   OSTaskCreate(
           Led1Task,//指向任务的指针
     (void*)0,//传递给任务的参数
     &Led1TaskStk[LED1_STK_SIZE-1],//指向堆栈栈顶
     LED1_TASK_PRIO  
   ); //创建LED1任务
   OSTaskSuspend(START_TASK_PRIO);//挂起开始任务
   OS_EXIT_CRITICAL(); //打开中断(退出临界区) 
}     
好像开始任务挂起了,但是没有恢复啊,为什么开始任务还能运行啊,我之前写的就是没有挂起开始任务,发现任务不能调度,才发现别人的都有“OSTaskSuspend(START_TASK_PRIO);//挂起开始任务”这句话,不明白啊,为什么要挂起。求指点。


 

                              

学电子,学音乐!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-30 14:56:11 | 显示全部楼层
回复【楼主位】XINSI:
---------------------------------
就是不让它工作,让别的任务工作
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-30 14:57:58 | 显示全部楼层
回复【楼主位】XINSI:
---------------------------------此任务不工作,让别的任务工作
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
 楼主| 发表于 2013-4-30 14:59:24 | 显示全部楼层
回复【2楼】1501697860:
---------------------------------
但是,不挂起,LED0任务和LED1任务这2个任务为什么不运行呢?及时不停止开始任务,LED0任务和LED1任务这2个任务也应该运行啊,已经创建了啊。
学电子,学音乐!!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-30 15:07:58 | 显示全部楼层
回复【4楼】XINSI:
---------------------------------
开始任务没有延时,因为它的优先级高,要么加延时,要么挂起
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
 楼主| 发表于 2013-4-30 15:13:18 | 显示全部楼层
回复【5楼】1501697860:
---------------------------------
加延时没用啊
学电子,学音乐!!
回复 支持 反对

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
 楼主| 发表于 2013-4-30 15:16:08 | 显示全部楼层
好像是不挂起的话,他就一直在创建LED0任务和LED1任务这2个任务,然后LED0任务和LED1任务这2个任务就还没有完整运行一次,就又被重新创建了。
学电子,学音乐!!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-30 15:19:33 | 显示全部楼层
回复【7楼】XINSI:
---------------------------------
亮下你的代码
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
 楼主| 发表于 2013-4-30 15:22:20 | 显示全部楼层
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h" 
#include "lcd.h"
#include "includes.h"

//创建三个任务:START_TASK,LED0_TASK,LED1_TASK
//主函数中创建START_TASK,START_TASK中创建LED0_TASK和LED1_TASK
//任务设置
///////////START_TASK//////////
#define  START_STK_SIZE    256 //定义开始任务堆栈大小
OS_STK   StartTaskStk[START_STK_SIZE];//定义开始任务堆栈区
#define  START_TASK_PRIO  10  //设置任务优先级
void     StartTask(void *pdata);//任务声明
//////////LED0_TASK///////////
#define  LED0_STK_SIZE     128 //定义LED0任务堆栈大小
OS_STK   Led0TaskStk[LED0_STK_SIZE];//定义LED0任务堆栈区
#define  LED0_TASK_PRIO   9//设置任务优先级
void     Led0Task(void *pdata);//任务声明
/////////LED1_TASK/////////
#define  LED1_STK_SIZE    128  //定义LED1任务堆栈大小
OS_STK   Led1TaskStk[LED1_STK_SIZE];//定义LED1任务堆栈区
#define  LED1_TASK_PRIO   8//设置任务优先级
void     Led1Task(void *pdata);//任务声明

int main(void)
{
   Stm32_Clock_Init(9);  //时钟初始化 72M
   delay_init(72); 
   uart_init(72,9600);   
   LED_Init(); //LED初始化
   OSInit();//初始化μC/OS-II
   OSTaskCreate(
           StartTask,//指向任务的指针
   (void*)0,//传递给任务的参数
   &StartTaskStk[START_STK_SIZE-1],//指向堆栈栈顶
   START_TASK_PRIO   
   ); //创建开始任务
  OSStart();//启动μC/OS-II


////////////开始任务/////////////
void  StartTask(void *pdata)
{
   OS_CPU_SR cpu_sr=0;
   pdata=pdata;
   OS_ENTER_CRITICAL();//关闭中断(进入临界区)
   OSTaskCreate(
           Led0Task,//指向任务的指针
   (void*)0,//传递给任务的参数
   &Led0TaskStk[LED0_STK_SIZE-1],//指向堆栈栈顶
   LED0_TASK_PRIO   
   ); //创建LED0任务 
   OSTaskCreate(
           Led1Task,//指向任务的指针
   (void*)0,//传递给任务的参数
   &Led1TaskStk[LED1_STK_SIZE-1],//指向堆栈栈顶
   LED1_TASK_PRIO   
   ); //创建LED1任务 
  // OSTaskSuspend(START_TASK_PRIO);//挂起开始任务(停止开始任务) 
   OS_EXIT_CRITICAL(); //打开中断(退出临界区)  
}
////////////////LED0任务/////////////////
void  Led0Task(void *pdata)
{
   for(;;)
   {
     LED0=!LED0;
 delay_ms(1000);
   }
}
////////////////LED1任务/////////////////
void  Led1Task(void *pdata)
{
   for(;;)
   {
     LED1=!LED1;
 delay_ms(2000);
   }
}
学电子,学音乐!!
回复 支持 反对

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
 楼主| 发表于 2013-4-30 15:22:43 | 显示全部楼层
回复【8楼】1501697860:
---------------------------------
恩、、好
学电子,学音乐!!
回复 支持 反对

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
 楼主| 发表于 2013-4-30 15:49:16 | 显示全部楼层
回复【10楼】XINSI:
---------------------------------
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h" 
#include "lcd.h"
#include "includes.h"

//创建2个任务ED0_TASK,LED1_TASK
//任务设置

//////////LED0_TASK///////////
#define  LED0_STK_SIZE     128 //定义LED0任务堆栈大小
OS_STK   Led0TaskStk[LED0_STK_SIZE];//定义LED0任务堆栈区
#define  LED0_TASK_PRIO   9//设置任务优先级
void     Led0Task(void *pdata);//任务声明
/////////LED1_TASK/////////
#define  LED1_STK_SIZE    128  //定义LED1任务堆栈大小
OS_STK   Led1TaskStk[LED1_STK_SIZE];//定义LED1任务堆栈区
#define  LED1_TASK_PRIO   8//设置任务优先级
void     Led1Task(void *pdata);//任务声明

int main(void)
{
   Stm32_Clock_Init(9);  //时钟初始化 72M
   delay_init(72); 
   uart_init(72,9600);   
   LED_Init(); //LED初始化
   OSInit();//初始化μC/OS-II
   OSTaskCreate(
           Led0Task,//指向任务的指针
   (void*)0,//传递给任务的参数
   &Led0TaskStk[LED0_STK_SIZE-1],//指向堆栈栈顶
   LED0_TASK_PRIO   
   ); //创建开始任务
  OSStart();//启动μC/OS-II



////////////////LED0任务/////////////////
void  Led0Task(void *pdata)
{
   OSTaskCreate(
           Led1Task,//指向任务的指针
   (void*)0,//传递给任务的参数
   &Led1TaskStk[LED1_STK_SIZE-1],//指向堆栈栈顶
   LED1_TASK_PRIO   
   ); //创建LED1任务 
   for(;;)
   {
     LED0=!LED0;
 delay_ms(2000);
   }
}
////////////////LED1任务/////////////////
void  Led1Task(void *pdata)
{
   for(;;)
   {
     LED1=!LED1;
 delay_ms(4000);
   }
}
学电子,学音乐!!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-30 16:17:10 | 显示全部楼层
 
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h" 
#include "lcd.h"
#include "includes.h"

//创建三个任务:START_TASK,LED0_TASK,LED1_TASK
//主函数中创建START_TASK,START_TASK中创建LED0_TASK和LED1_TASK
//任务设置
///////////START_TASK//////////
#define  START_STK_SIZE    256 //定义开始任务堆栈大小
OS_STK   StartTaskStk[START_STK_SIZE];//定义开始任务堆栈区
#define  START_TASK_PRIO  10  //设置任务优先级
void     StartTask(void *pdata);//任务声明
//////////LED0_TASK///////////
#define  LED0_STK_SIZE     128 //定义LED0任务堆栈大小
OS_STK   Led0TaskStk[LED0_STK_SIZE];//定义LED0任务堆栈区
#define  LED0_TASK_PRIO   9//设置任务优先级
void     Led0Task(void *pdata);//任务声明
/////////LED1_TASK/////////
#define  LED1_STK_SIZE    128  //定义LED1任务堆栈大小
OS_STK   Led1TaskStk[LED1_STK_SIZE];//定义LED1任务堆栈区
#define  LED1_TASK_PRIO   8//设置任务优先级
void     Led1Task(void *pdata);//任务声明

int main(void)
{
   Stm32_Clock_Init(9);  //时钟初始化 72M
   delay_init(72); 
   uart_init(72,9600);   
   LED_Init(); //LED初始化
   OSInit();//初始化μC/OS-II
   OSTaskCreate(
           StartTask,//指向任务的指针
   (void*)0,//传递给任务的参数
   &StartTaskStk[START_STK_SIZE-1],//指向堆栈栈顶
   START_TASK_PRIO   
   ); //创建开始任务
  OSStart();//启动μC/OS-II


////////////开始任务/////////////
void  StartTask(void *pdata)
{
   OS_CPU_SR cpu_sr=0;
   pdata=pdata;
   OS_ENTER_CRITICAL();//关闭中断(进入临界区)
   OSTaskCreate(
           Led0Task,//指向任务的指针
   (void*)0,//传递给任务的参数
   &Led0TaskStk[LED0_STK_SIZE-1],//指向堆栈栈顶
   LED0_TASK_PRIO   
   ); //创建LED0任务 
   OSTaskCreate(
           Led1Task,//指向任务的指针
   (void*)0,//传递给任务的参数
   &Led1TaskStk[LED1_STK_SIZE-1],//指向堆栈栈顶
   LED1_TASK_PRIO   
   ); //创建LED1任务 
  // OSTaskSuspend(START_TASK_PRIO);//挂起开始任务(停止开始任务) 
   OS_EXIT_CRITICAL(); //打开中断(退出临界区) 
delay_ms(8000);  
}
////////////////LED0任务/////////////////
void  Led0Task(void *pdata)
{
   for(;;)
   {
     LED0=!LED0;
 delay_ms(1000);
   }
}
////////////////LED1任务/////////////////
void  Led1Task(void *pdata)
{
   for(;;)
   {
     LED1=!LED1;
 delay_ms(2000);
   }
}

坚持学习!就能成功!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-30 16:20:07 | 显示全部楼层
LED1_TASK_PRIO    
   ); //创建LED1任务  
  // OSTaskSuspend(START_TASK_PRIO);//挂起开始任务(停止开始任务)  
   OS_EXIT_CRITICAL(); //打开中断(退出临界区) 
delay_ms(8000);   

////////////////LED0任务///////////////// 
void  Led0Task(void *pdata)
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-20 18:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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