OpenEdv-开源电子网

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

ucosii操作系统下任务执行及挂起与恢复,加锁解锁,信号量相关调试,求拍砖指导

[复制链接]

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
发表于 2015-4-11 19:37:29 | 显示全部楼层 |阅读模式

201543

今天,照着STM32论坛上八度空间老师的一篇关于ucosii操作系统移植到战舰开发板上的文章http://www.openedv.com/posts/list/33492.htm,进行了我的首次ucos移植过程。在对编译错误进行修改后,正式编译通过。满心欢喜,心情倍爽。编译出错的主要原因是有些函数在我建的工程里边没有,对其进行一下更正。

  1. 打开八度空间老师的工程发现主函数main.c里边初始化心跳的函数其实就是延时初始化函数:

    void OS_Heart_Init(void)

    {

           delay_init();

    }。所以在我的工程里边直接用delay_init();进行初始化心跳,也就是时钟节拍。

  2. 初始化中断优先级函数:

    void MY_NVIC_PriorityGroup_Config(uint32_t NVIC_PriorityGroup)

    {

    //检测输入参数

    assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));

     

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup);   //设置中断分组

    //      uint32_t temp,temp1;

    //     

    //      temp1 = (~NVIC_PriorityGroup) & 0x00000007;//取后三位

    //      temp1 <<= 8;

    //      temp = SCB->AIRCR;  //读取先前的设置

    //      temp &= 0x0000f8ff; //清空先前分组

    //      temp |= 0x05fa0000; //写入钥匙

    //      temp |= temp1;         

    //      SCB->AIRCR = temp;  //设置分组

    }

    在我的工程当中,我将主函数里的初始化中断优先级函数直接用NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);代替,以及串口初始化等都改成工程内自定义的函数。

    经过以上几步,编译不出现错误。工程当中建立的两个LED任务在操作系统的带领下正常运行,第一次移植就这样完成了,感觉很好。具体见工程《UCOSII实验1

     

    201546

    今天,看了任哲老师的嵌入式实时操作系统原理及应用里的有关任务挂起与恢复相关知识,对上次建立的工程中的两个LED任务进行了实验验证。我在LED1任务里边对LED0任务进行挂起与恢复。当LED1执行20次的时候,对LED0任务进行挂起,用函数OSTaskSuspend(LED0_Task_PRIO);实现,当LED1再执行20次的时候,对LED0任务进行恢复,用函数OSTaskResume(LED0_Task_PRIO);实现。这个定义一个整型变量并在if条件句中判断即可实现,具体见工程《UCOSII实验2-1》。

    201547

    今天主要想到能否在一个任务里边先对其进行挂起,然后过一段时间对其进行恢复。经过试验验证,答案是否定的。后来仔细分析了一下,任务本身挂起后已经没有运行了,怎么还能通过它来进行任务的恢复。只能在任务本身中对其挂起,然后在其他任务重对其恢复。想到这些,立即动手实验了一下,发现盲目的挂起与恢复是不能实现的。我们需要判断要实现恢复的任务是否已经挂起,即要查找任务的状态,这里,通过搜集网上资料,可通过一下语句实现:

    if(time0==20&&((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY))//被恢复的任务必须已经被挂起

                  {

                         time0 = 0;

                         OSTaskResume(LED1_Task_PRIO);

                  }

    当然需要先定义任务控制块变量并查表:

    OS_TCB *ptcb;

    ptcb = OSTCBPrioTbl[LED1_Task_PRIO];

    如此,在任务LED1任务中挂起他自身,在任务2中添加上面的任务恢复代码,即可显现恢复。具体见工程《UCOSII实验2-2》。

     

    201549

    OSSchedLock(void);这个函数又叫上锁函数,如果在一个任务里面调用了上锁函数,那么OSSched()这个任务切换函数就不会执行也就是说不会进任务调度。

    调用OSSchedLock()以后,用户的应用程序不得使用任何能将现行任务挂起的系统调用。也就是说,用户程序不得调用OSMboxPend()OSQPend()OSSemPend()OSTaskSuspend(OS_PR1O_SELF)OSTimeDly()OSTimeDlyHMSM(),直到OSLockNesting回零为止。因为调度器上了锁,用户就锁住了系统,任何其它任务都不能运行。

    调用一次OSSchedLock(),就会对全局变量OSLockNesting1,调用OSSchedUnlock ()一次就对全局变量OSLockNesting1。当OSLockNesting是零的时候,系统才能进行任务调度

    但是上锁了任务是可以中断,若任务遇到中断,则中断函数的执行会为OSIntNesting变量加1,当中断返回时又要判断OSLockNesting是否为0,如果不为0说明系统仍被锁,直接退出中断。如果OSLockNesting0说明系统未被锁,CPU进入任务就绪表查找优先级最高的任务。所以上锁函数执行后,CPU一直处于当前任务与中断服务函数之间的运行,直到解锁函数将OSLockNestingOSIntNesting的值减到0时,方可解除系统锁定。

    程序当中通过变量time1累加到10时对任务加锁,加锁后一直执行LED1任务。当time1继续累加到80时对其进行解锁,重新LED1LED0交替执行,循环往复。具体见工程《UCOSII实验3》。

     

    2015410

    通过信号量控制LED0的亮灭。

    OSSemCreate(cnt)赋初始值cntOSSemPend一次,cnt-- 一次,OSSemPost一次,cnt++一次。初始化OSSemCreate(1),那么一个任务中有OSSemPend,那么可以执行,执行之后cnt==0,其他任务的OSSemPend无法获得sem,只能等待,除非任务一有OSSemPost,使其cnt++,这样其他任务的Pend可以执行。具体见工程《UCOSII实验4》。

                                                                                                                                                                                 济世良驹于大连理工大学

                                                                                                                                                                                            2015411

ucosii移植笔记.pdf

102.63 KB, 下载次数: 438

战舰开发板ucosii调试实验.zip

17.34 MB, 下载次数: 658

一直在路上,一直在成长。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-11 22:44:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-4-12 09:06:00 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
顶原子哥。
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-4-14 10:35:45 | 显示全部楼层
回复【3楼】济世良驹:
---------------------------------
看你后面的解释,所以这就是原子哥实验里KEY1按下多次后,蜂鸣器每隔1秒叫一次的原因吗
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-4-14 12:27:42 | 显示全部楼层
回复【4楼】zzj:
---------------------------------
上面的工程没涉及到按键,延时是通过延时函数delay_ms实现的,以后多多交流。向朋友问好。
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-4-14 13:25:25 | 显示全部楼层
回复【5楼】济世良驹:
---------------------------------
我是在原子哥实验里看到的。刚学ucos向你学习学习
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-4-14 14:38:31 | 显示全部楼层
嗯,共同学习,加油。
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-4-14 14:39:06 | 显示全部楼层
回复【6楼】zzj:
---------------------------------
共同学习,加油。
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-4-14 14:40:55 | 显示全部楼层
回复【8楼】济世良驹:
---------------------------------
好好,加油
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-4-14 14:49:09 | 显示全部楼层
回复【9楼】zzj:
---------------------------------
你现在学到什么程度啦
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-4-14 14:56:10 | 显示全部楼层
回复【10楼】济世良驹:
---------------------------------
菜鸟程度,看了原子哥里的一些资料和实验例程,没仔细研究
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-4-14 15:03:09 | 显示全部楼层
回复【11楼】zzj:
---------------------------------
加油哦
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-4-14 15:04:10 | 显示全部楼层
回复【12楼】济世良驹:
---------------------------------
你呢?应该学得不错了吧
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-4-14 15:11:46 | 显示全部楼层
回复【13楼】zzj:
---------------------------------
我也是刚刚入门,有问题一起交流哈。
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-4-14 15:14:24 | 显示全部楼层
回复【14楼】济世良驹:
---------------------------------
ok
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-6-11 00:53:38 | 显示全部楼层
谢谢楼主分享,我也准备用原子的任务切换例程实验下任务的挂起和恢复,调度器的上锁与解锁,看任哲的书,感觉运行的结果和运行的代码有点出入,明晚试试在原子板子上运行看看结果什么样
合肥-文盲
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-6-11 00:57:26 | 显示全部楼层
任哲那本书time == 40恢复运行后,不是立马切换到M任务运行,而是继续往下面运行一次Y任务,接着才运行M任务,感觉和逻辑不符合,M的优先级更高,理论上Resume之后,应该切换到M任务运行,显示一个M,再切换到Y任务显示Y的,但是任哲的代码运行结果是41个Y再显示M,我觉得应该是40个Y,接着就要显示M了,疑惑啊,明天晚上实验原子的
合肥-文盲
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-7-4 21:31:29 | 显示全部楼层
恩,你研究的很仔细,相比而言,我倒没那么仔细了。这些问题我都没考虑,目前只是能实现基本原理就可以。我好长时间没搞了,一直在搞课题相关的
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-11-14
在线时间
7 小时
发表于 2015-8-27 08:21:20 | 显示全部楼层
多谢分享!
我也在学习uCOS-II,现在正在进入调试学习阶段,请问你是使用Keil uCOS-II插件调试uCOS-II任务的?
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-8-27 08:27:47 | 显示全部楼层
回复【19楼】LINGdong:
---------------------------------
不是,直接用keil的,下载ucos文件,将里面的.c文件加入到工程当中,就可以一直,可以看八度空间的文章,他有移植过程。
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-11-14
在线时间
7 小时
发表于 2015-8-28 10:17:51 | 显示全部楼层
多谢回复!
在学uCOS-II多任务编程时,当把代码下载到板子上,什么都没有反应的时候,这时,我就希望能找到一种方式能看到代码的运行过程,好Debug。现在我在这方面的困难暂时比较大。
看到你对uCOS-II有比较深入的研究,希望向你请教如何调试代码---用哪种调试方式或工具,如何调试等。
另外,八度空间的文章我看了,很好。
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-8-28 11:57:17 | 显示全部楼层
回复【21楼】LINGdong:
---------------------------------
你找找卢友亮的有关UCOS的PPT,我记得有,你先自己找找吧,找不到的话我再找找看
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-8-29 09:24:27 | 显示全部楼层
回复【21楼】LINGdong:
---------------------------------
刚分享了一些ucos相关的ppt,教你如何在VC下编译运行,对操作系统的理解很有帮助,可按需下载。
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-11-14
在线时间
7 小时
发表于 2015-8-29 11:04:58 | 显示全部楼层
回复【23楼】济世良驹:
---------------------------------
多谢你的回复。好,我去看看卢有亮的ppt。
另外,不好意思,请教你分享的ppt在哪里?
最后,我是在MSP430F149上运行uCOS-II;我也有STM32的板子。
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
 楼主| 发表于 2015-8-29 12:20:41 | 显示全部楼层
回复【24楼】LINGdong:
---------------------------------
今天刚发的贴
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 11:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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