OpenEdv-开源电子网

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

ucosii中任务挂起和恢复的问题

[复制链接]

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
发表于 2014-8-1 10:58:22 | 显示全部楼层 |阅读模式
5金钱
    我想在ucosii中完成密码锁的功能,现在开辟了两个任务,任务1是main,只显示一个编号,任务2是password,由于这两个是互斥的,所以我在两个函数中都加入了挂起自己,然后恢复另一个任务的函数。
    上电后第一次运行,按下键盘上的key1键,的确能从main跳到password函数中,然后在输入密码函数中按下key2,能返回到main中,可是返回到main之后,再按key1,程序就跑飞了,请问为什么第一次能有用,第二次再来一遍的时候就不行了呀?
[mw_shl_code=c,true]void main_task(void *pdata) { while(1) { display_GB2312_string(4,40,0,"NO.007"); GPIO_WriteBit(GPIOC, GPIO_Pin_1,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_1)))); if(keyval == 'a') { OSTaskResume(PASSWORD_TASK_PRIO); OSTaskSuspend(MAIN_TASK_PRIO); } OSTimeDlyHMSM(0,0,0,10); } }[/mw_shl_code]



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

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1843
金钱
1843
注册时间
2014-6-27
在线时间
983 小时
发表于 2014-8-1 11:02:36 | 显示全部楼层
按键使用完没有清除吧?
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-8-1 11:03:34 | 显示全部楼层
keyval是在TIM定时器中断中进行判断键值的
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-8-1 11:06:20 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
在输入完密码之后,keyval的值肯定不等于'a',因为键值是在定时器中断中判断的,而keyval是全局变量,不清它会影响程序吗?
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 11:06:24 | 显示全部楼层
password 部分有问题,如果先挂起自己就没法恢复main  如果先恢复mian 就没法挂起自己。建议单独再弄一个线程,更具标志位来设置挂起哪个线程
目前在玩STM32,BBB,RPi
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-8-1 11:08:28 | 显示全部楼层
回复【5楼】w0rmis20:
---------------------------------
好的,的确main的prio是比password高的,我去试试,谢谢你了
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1843
金钱
1843
注册时间
2014-6-27
在线时间
983 小时
发表于 2014-8-1 11:10:03 | 显示全部楼层
4楼说的也是个方法,你也可以用互斥信号量来做。
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-8-1 11:16:33 | 显示全部楼层
回复【7楼】TinyBoy:
---------------------------------
嗯,好的
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-8-1 11:33:30 | 显示全部楼层
回复【5楼】w0rmis20:
---------------------------------
我试了下,你说的的确是一个问题,可是第二次依然没法进入password函数,我在TIM中设置了一个LED灯在不停地亮灭,我发现第一次返回MAIN函数之后,一旦再次按下key2想进入password,TIM中断里面的LED灯都不亮了 ,中断都不进入了
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-8-1 11:38:51 | 显示全部楼层
回复【9楼】siwangqixiang:
---------------------------------
按其他的键值没关系,唯独按下key2,中断的灯就不闪了
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 11:44:18 | 显示全部楼层
回复【9楼】siwangqixiang:
---------------------------------
你刚才修改了什么?
目前在玩STM32,BBB,RPi
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-8-1 11:45:59 | 显示全部楼层
[mw_shl_code=c,true]void select_task(void *pdata) { while(1) { OSTaskResume(MAIN_TASK_PRIO); OSTaskSuspend(PASSWORD_TASK_PRIO); OSTaskSuspend(SELECT_TASK_PRIO); } }[/mw_shl_code]

这个优先级设为比main和password更高,在start任务中就挂起,在password输入完密码后恢复
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-8-1 11:48:23 | 显示全部楼层
其实按理来说,第一次返回后,按照我之前的处理,先恢复MAIN再挂起PASSWORD,的确是不能挂起自己了,这样的话又因为我在main中设置了OSTimeDly函数,应该会在MAIN和PASSWORD任务中来回切换,可是现象是只有MAIN在起作用,而且一旦按下key2,程序就跑飞了,连中断都不进入了
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 12:16:38 | 显示全部楼层
回复【13楼】siwangqixiang:
---------------------------------
你用变量存 OSTaskResume() 和OSTaskSuspend()的返回值然后用调试器看看返回什么
目前在玩STM32,BBB,RPi
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 12:23:24 | 显示全部楼层
回复【13楼】siwangqixiang:
---------------------------------
你在中断里加了OSIntEnter()和OSIntExit()了吧?
目前在玩STM32,BBB,RPi
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-8-1 13:15:32 | 显示全部楼层
回复【15楼】w0rmis20:
---------------------------------
加了
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-8-1 13:15:48 | 显示全部楼层
[mw_shl_code=c,true]//TIM3定时中断 void TIM3_IRQHandler(void) { #ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了. OSIntEnter(); #endif if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx更新中断标志 GPIO_WriteBit(GPIOC, GPIO_Pin_13,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)))); keyval = KeyPro(); } #ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了. OSIntExit(); #endif }[/mw_shl_code]

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 13:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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