OpenEdv-开源电子网

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

操作系统程序疑问

[复制链接]

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
发表于 2012-7-1 09:01:40 | 显示全部楼层 |阅读模式

一下是截取的原子哥的控制小灯的程序,我最近看了关于操作系统的那本书还是有很多疑问请看一下下面的程序
疑问:程序先创建了TaskStart然后在TaskStart里面创建了TaskLed和TaskLed1,我想问的是他们三个任务的执行顺序是怎么样的啊??第一个肯定是TaskStart这个我知道,那么
TaskLed和TaskLed1是怎么来回切换的那????都是死循环啊!!

 int main(void)
{       
 Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时初始化
 uart_init(72,9600);  //串口初始化为9600
 LED_Init();      //初始化与LED连接的硬件接口 
 SysTick_Configuration();
 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;
 OS_ENTER_CRITICAL();  
 OSTaskCreate(TaskLed, (void * )0, (OS_STK *)&TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio);
 OSTaskCreate(TaskLed1, (void * )0, (OS_STK *)&TASK_LED1_STK[LED1_STK_SIZE-1], LED1_TASK_Prio);
 OSTaskSuspend(START_TASK_Prio); //suspend but not delete
 OS_EXIT_CRITICAL();
}
//任务1
//控制DS0的亮灭.
void TaskLed(void *pdata)
{
 while(1)
 {
  LED0=!LED0;
  OSTimeDlyHMSM(0,0,0,500); 
 }
}
//任务2
//控制DS1的亮灭.
void TaskLed1(void *pdata)
{
 while(1)
 {
  LED1=!LED1;
  OSTimeDlyHMSM(0,0,0,200); 
 }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-7-1 10:47:58 | 显示全部楼层
首先执行优先级最高的任务.带优先级最高的任务让出CPU(延时)的时候,执行优先级低的任务.当优先级低的任务也让出CPU的时候,就会执行系统的空闲任务了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
 楼主| 发表于 2012-7-1 13:12:32 | 显示全部楼层
还是有点不太明白
//设置任务优先级
#define LED_TASK_Prio       9
#define LED1_TASK_Prio      5
#define START_TASK_Prio     10
那么优先执行LED1_TASK_Prio完了执行LED_TASK_Prio吗??
那么这个程序总的执行顺序是怎样的??就是执行顺利不理解
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-7-1 13:37:05 | 显示全部楼层
既然这么纠结,直接用keil仿真不就清白了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
 楼主| 发表于 2012-7-2 21:48:43 | 显示全部楼层
你好原子哥我在单步仿真的时候就运行到OSStart();然后就不动了!!
但是在逻辑图里面看波形是可以的,怎么搞可以看到每一步的运行啊
int main(void)
{      
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化 
uart_init(72,9600);  //串口初始化为9600
LED_Init();     //初始化与LED连接的硬件接口  
SysTick_Configuration();
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;    
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-7-3 00:47:38 | 显示全部楼层
你在START_TASK里面设置断点,看看能不能跑到START_TAST里面?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2012-3-20
在线时间
9 小时
发表于 2012-7-3 16:36:23 | 显示全部楼层
不同的任务有不同的优先级,每一个任务都有自己的特有的优先级数,数值越低优先级越高,最低优先级的任务一般是空闲任务,死循环是有的,但是ucOSII的时钟节拍可以使得任务挂起或者恢复挂起之前将任务保存入寄存器,恢复时再恢复继续任务,多任务实时系统的实质是多个任务(运行起来时不一定马上就运行完成)不断的切换,使得人们感觉可以多个任务同时进行,但其实还是一个时刻只运行一个任务。建议看一看邵贝贝的《嵌入式实时操作系统μC/OS-2》,看过4章,你就不会这么难理解了
无往而不胜!
回复 支持 反对

使用道具 举报

30

主题

155

帖子

0

精华

高级会员

Rank: 4

积分
768
金钱
768
注册时间
2012-6-14
在线时间
204 小时
发表于 2012-7-3 17:30:48 | 显示全部楼层
你可以试一下,把那个延时OSTimeDlyHMSM(0,0,0,500); 这个注释掉,然后你就会有一点明白了,你可以先试一下把这句话注释掉,然后看一下现象,我要是记得不错的话,如果没有这个延时,那么,就会只有最高优先级的任务执行。
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
 楼主| 发表于 2012-7-3 20:01:03 | 显示全部楼层
明白了原子哥 设置断点可以进入
谢谢各位的回答!!!
如果把延时去掉肯定不会执行其他任务了CPU不会释放
为什么在系统里面加delay_ms(20);这条语句就执行错误的结果啊 难道在操作系统里面不能用这个吗?????????
事实是不可以的!!!为什么啊???
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-7-3 22:40:15 | 显示全部楼层
回复【9楼】shenhao7752376:
---------------------------------
因为我的delay和ucos共用了systick,目前这个版本会出问题的.所以不能共存!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 14:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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