OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: 龙之谷

菜鸟开帖,持续更新90天,顺序学习开发板大部分实验,以此帖作为一个坚持的动力

  [复制链接]

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-2 16:55:28 | 显示全部楼层
回复【450楼】shblh:
---------------------------------
哈哈,共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-2 22:23:55 | 显示全部楼层
续02-----UCOSII的任务

【基于任哲老师嵌入式实时操作系统UCOSII原理及应用(以后简称UCOSII原理及应用)第三章+STM32F4开发指南第六十一章的总结】

1.从代码来看,程序控制块就是一个结构体


为了把这个结构与被管理代码关联起来,该结构包含了一个指向被管理代码的指针(函数指针)


由于操作系统可通过这个结构来控制与之关联的代码,所以人们把这种结构叫做代码控制块或程序控制块。


2.当被管理代码数量不大且其控制块又比较小时,通常采用数组来作为程序控制块注册表。但当被管理代码的数目较大,且其控制块又较大时,则会因数组需要占用较大的连续内存空间而采用链表来作为程序控制块注册表,具体做法为:在程序控制块中再添加两个指针成员,一个用来指向前一个控制块,另一个用来指向下一个控制块,从而把所有被管理代码的控制块用链表组织起来。




3.任务三个部分组成:

①任务程序代码(函数)--就是任务的执行部分;
②任务堆栈--用来保存任务的工作环;
③任务控制块--就是关联了任务代码的程序控制块,记录了任务的各个属性。


4.进程与线程区别(
http://jingyan.baidu.com/article/624e74598efcc834e9ba5a66.html
①进程--具有私有空间的任务;
②线程--没有私有空间的任务。(UCOSII中的所有任务属于线程)


5.基础知识点总结

①任务的执行代码通常是一个无限循环结构,并且这个循环中可以响应中断,这种结构也叫做超循环结构
②UCOSII任务的代码就是一个C语言函数,为了可以传递各种不同类型的数据甚至函数,UCOSII把任务的参数定义成了一个void类型的指针;
③UCOSII预定义了两个系统任务:空闲任务和统计任务。其中,空闲任务是每个应用程序必须使用的,而统计任务则是应用程序可以根据实际需要来选择使用的(统计任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中以便其他应用程序来了解CPU的利用率);
④系统总是把最低优先级别OS_LOWES_PRIO自动赋给空闲任务,如果应用程序使用了统计任务,则系统还会把优先级别OS_LOWEST_PRIO-1自动赋给统计任务,因此用户任务可以使用的优先级别时0、1、2、...、OS_LOWEST_PRIO-2共OS_LOWEST_PRIO-1个;
⑤由于每个任务都具有唯一的优先级别,因此这个优先级别也是这个任务在系统中的标识;
堆栈就是在存储器中按数据“后进先出(LIFO)”的原则组织的连续存储空间,所有UCOSII任务的任务控制快都含有一个指向该任务堆栈的指针,在CPU启动运行一个任务时,CPU的各寄存器总是需要预置一些初始数据,例如指向任务的指针、程序状态字等,由于他们都是任务的私有数据,所以应该将他们都存放在任务堆栈
任务调度就是通过一个算法在就绪任务中确定应该马上运行的任务,操作系统用于负责这项工作的程序模块叫做调度器,UCOSII有两种调度器:一种是任务级的调度器,用OSSched()来实现,另一种是中断级的调度器,用OSIntExt()来实现
任务切换条件:任务被中止运行时的位置叫做断点,把当时存放在CPU的PC、PSW和通用寄存器等各寄存器中的数据叫做断点数据,当任务恢复运行时,必须在断点处以断点数据作为初始数据接着运行,才能实现“无缝”的接续运行。因此,要实现这种对接,必须在任务被中止时就把该任务的断点数据保存在堆栈中,而被重新运行时,则要把堆栈中的这些断点数据再恢复到CPU的各寄存器中,只有这样,才能使被中止运行的任务在恢复运行时可以实现“无缝”的持续运行。
综上,任务的切换就是断点数据的切换,断点数据的切换就是CPU堆栈指针的切换,被中止运行任务的任务堆栈指针要保护到该任务的任务控制块中,待运行任务的任务堆栈指针要由该任务控制块转存到CPU的SP中;


6.任务相关函数
①创建任务的工作实质上就是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。可以用函数OSTaskCreate();OSTaskCreateExt();来创建任务;

②任务的挂起函数OSTaskSuspend(INT8U prio)其中,prio为待挂起任务的优先级别,如果要挂起自身,则参数必须为常数OS_PRIO_SELF;
③恢复任务函数OSTaskResume(INT8U prio);
④任务优先级别的修改函数OSTaskChangePrio(INT8U oldprio, INT8U newprio);
⑤任务的删除函数OSTaskDel(INT8U prio);
【注】有时任务会占用一些动态分配的内存或信号量之类的资源,这时如果有其他任务把这个任务删除了,那么被删除任务所占用的一些资源就会因为没有被释放而丢失,因此,在删除一个资源的任务时一定要谨慎,具体做法是,提出删除任务请求的任务只负责提出删除任务请求,而删除工作则由被删除任务自己来完成,这样,被删除任务就可以根据自身的具体情况来决定何时删除自身,同时也有机会在删除自身之前把占用的资源释放掉。而如果想使提出删除任务请求的任务和被删除任务之间能够按所述来执行删除工作,则双方必须由某种通信方法,这种方式就是下一个函数;
⑥请求删除任务函数OSTaskDelReq(INT8U prio);被删除任务在调用这个函数时,函数的参数应该为OS_PRIO_SELF。
⑦在应用程序运行中需要了解一个任务的指针、堆栈等信息,这时就可以通过调用函数OSTaskQuery(INT8U prio, OS_TCB *pdata);来获取任务的信息,如果查询成功,则函数返回OS_NO_ERR,并把查询得到的任务信息存放在结构OS_TCB类型(pdata)的变量中。


7.①在使用UCOSII的所有服务之前,必须调用UCOSII的初始化函数OSInit(),对全局变量和数据结构进行初始化,以建立UCOSII自身的运行环境进行初始化;

②UCOSII任务的管理是从启动OSStart()开始的,当然,其前提条件是在该函数之前至少创建了一个用户任务。


8.例程分析

①宏定义,为创建任务做前期准备工作


②程序从main函数开始,初始化各配置及UCOSII,创建一个起始任务并启动UCOSII


③在起始任务中创建其他需要任务并将起始任务挂起不再使用


④编写一般UCOSII任务函数




9.临界段知识

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-5 23:17:03 | 显示全部楼层
续03-----UCOSII函数一览表

这几天没精力做UCOSII实验,简单地整理一下函数吧,便于以后查看~~~~~



以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

3

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2015-11-6
在线时间
83 小时
发表于 2015-11-6 17:00:09 | 显示全部楼层
看到楼主发的帖子,已经开始膜拜了。我是刚拿到原子哥的F4板子,也担心自己没有毅力会半途而废。楼主给了自己一剂强心针,再困难也要学习到底。为正能量点赞!【点三下哈】楼主继续更新,会持续关注楼主的帖子。

在此也希望自己能够学有所成,像原子哥一样哈!
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-6 20:18:04 | 显示全部楼层
回复【454楼】luhshuay:
---------------------------------
共勉~~~~~

加油~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-6 20:29:24 | 显示全部楼层
   这几天看前段时间的更新,竟然发现很多小错误,或拼写、或字词,本以为自己已经很仔细了,没想到各种小毛病不断,虽强迫症亦表示无可奈何,已不能再编辑了,如果有看帖子的朋友请注意一下吧!!!!!

                                       2015年11月06日 20:36:13
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

19

主题

217

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-1
在线时间
34 小时
发表于 2015-11-7 10:43:13 | 显示全部楼层
楼主已登堂入室,加油。
一直在路上,一直在成长。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-11-7 13:17:37 | 显示全部楼层
回复【456楼】龙之谷:
---------------------------------
已经登堂入室了,期待继续更新。。。
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-8 16:08:29 | 显示全部楼层
回复【457楼】济世良驹:
---------------------------------
谢良驹兄鼓励~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-8 16:09:05 | 显示全部楼层
回复【458楼】八度空间:
---------------------------------
谢八度老师鼓励~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-11-8 20:07:40 | 显示全部楼层
回复【460楼】龙之谷:
---------------------------------
呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-8 21:54:48 | 显示全部楼层
续04-----统计任务+堆栈使用情况检测

一、统计任务
1.UCOSII有一个提供运行时间统计的任务(OS_TaskStat())。如果用户将系统定义常数OS_TASK_STAT_EN(见文件OS_CFG.H)设为1,这个任务就会建立。一旦得到允许,统计任务每秒钟运行一次,计算当前CPU利用率,即OS_TaskStat()告诉用户应用程序使用了多少CPU时间,用百分比表示,这个值存放在一个有8位整数OSCPUsage中,精度是1个百分点。
2.如果用户应用程序打算使用统计任务,必须在初始化时建立一个唯一的任务,在这个任务中调用OSStatInit()。换句话说,在调用系统启动函数OSStart()之前,用户初始化代码必须建立一个任务,在这个任务中调用系统统计初始化函数OSStatInit(),然后再建立应用程序中的其他任务。
3.使用过程
①在OS_CFG.H中置OS_TASK_STAT_EN为1;
②主函数main中建立一个起始任务
[mw_shl_code=c,true] OSInit(); OSTaskCreate(start_task, (void *)0, (OS_STK*)&START_TASK_STK[START_STK_SIZE-1], START_TASK_PRIO); OSStart();[/mw_shl_code]
③在起始任务中调用OSStatInit()
[mw_shl_code=c,true]void start_task(void *pdata) { OS_CPU_SR cpu_sr = 0; pdata = pdata; ... OSStatInit(); //开启统计任务 ... }[/mw_shl_code]
④直接在任一任务中使用使用率变量OSCPUsage即可
[mw_shl_code=c,true]void main_task(void *pdata) { ... while(1) { ... if(tcnt == 50) { tcnt = 0; LCD_ShowxNum(192, 30, OSCPUUsage, 3, 16, 0); //CPU使用率显示 } tcnt++; delay_ms(10); } }[/mw_shl_code]

二、任务堆栈实际使用情况
在UCOSII学习中,对于堆栈大小的设置没有头绪,设置多大既不过多浪费空间,又能够保证程序正常运行心理没底,基于此,网上找了一些资料进行学习,以便对堆栈有一些合理的掌控。
1.相关函数/结构
①需使用创建扩展任务函数OSTaskCreateExt()创建任务,其原型
[mw_shl_code=c,true]#if OS_TASK_CREATE_EXT_EN > 0 INT8U OSTaskCreateExt ( void (*task)(void *pd), //建立扩展任务(任务代码指针 void *pdata, //传递参数指针 OS_STK *ptos, //分配任务堆栈栈顶指针 INT8U prio, //分配任务优先级 INT16U id, //(未来的)优先级标识(与优先级相同) OS_STK *pbos, //分配任务堆栈栈底指针 INT32U stk_size, //指定堆栈的容量(检验用) void *pext, //指向用户附加的数据域的指针 INT16U opt //建立任务设定选项 ) #endif[/mw_shl_code]
②UCOSII有专门堆栈检测函数OSTaskStkChk(),其原型为
[mw_shl_code=c,true]INT8U OSTaskStkChk ( INT8U prio, //待测任务的优先级 OS_STK_DATA *pdata //指向一个类型为OS_STK_DATA的结构体 )[/mw_shl_code]
参数prio为指定要获取堆栈信息的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务本身的信息;
③在堆栈检测函数中涉及到一个OS_STK_DATA的结构体
[mw_shl_code=c,true]#if OS_TASK_CREATE_EXT_EN > 0 typedef struct { INT32U OSFree; //堆栈中未使用的字节数 INT32U OSUsed; //堆栈中已使用的字节数 } OS_STK_DATA; #endif[/mw_shl_code]
2.使用方法
①在ucos_ii.h文件中对OS_TASK_OPT_STK_CLR等进行了配置(如下),无需进一步设置
[mw_shl_code=c,true]#define OS_TASK_OPT_STK_CHK 0x0001u /* Enable stack checking for the task */ #define OS_TASK_OPT_STK_CLR 0x0002u /* Clear the stack when the task is create */[/mw_shl_code]
②将创建扩展任务最后一个参数opt设置为OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR;
③定义一个OS_STK_DATA变量,如OS_STK_DATA StackBytes;
④调用堆栈检测函数OSTaskStkChk(),如OSTaskStkChk(TestTaskPRIO, &StackBytes);
⑤StackBytes.OSFree的值即为被测任务堆栈未使用的字节数;
 StackBytes.OSUsed的值即为被测任务堆栈已使用字节数。
3.建议
其一,将被测任务经历最坏的堆栈使用状态,测出来的使用率才可靠;
其二,堆栈使用最好在50%~80%之间,太小浪费空间,太大不安全;
其三,最好在工程中单独建立一个优先级较低而延时较长的任务来测试其他任务的堆栈使用情况,不用时可以挂起该任务。

参考/相关链接
【1】http://blog.csdn.net/zhanglianpin/article/details/6326752
【2】http://www.2cto.com/os/201411/354880.html
【3】http://blog.chinaunix.net/uid-2615303-id-193740.html

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-8 22:07:35 | 显示全部楼层
回复【462楼】龙之谷:
---------------------------------
顶!d=====( ̄▽ ̄*)b
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-8 23:54:34 | 显示全部楼层
回复【463楼】正点原子:
---------------------------------
这个符号比较nice,哈哈~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-9 22:16:40 | 显示全部楼层
续05-----UCOSII统计任务+堆栈使用情况简单测试

本打算在开发指南UCOSII实验二基础上进行测试,由于自己实验二移植出错且实验二使用到触屏等较多内容不便屏幕显示布局,而简单学习、测试可以在更容易一些的试验一基础进行,基于此得附件程序。

程序中共有四个任务:起始任务、LED0指示灯、LED1指示灯、测试任务。

起始任务--创建其他任务而后挂起;
LED0指示灯--LED0间歇闪烁任务;
LED1指示灯--LED1间歇闪烁任务;
测试任务--在液晶屏上显示CPUsage以及LED0指示灯、LED1指示灯对堆栈的使用情况。

56.ucosii_1 - 3.rar

2.49 MB, 下载次数: 71

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2015-11-13
在线时间
0 小时
发表于 2015-11-13 09:56:38 | 显示全部楼层
占位,我刚买了开发板及书,向楼主学习。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-13 11:41:24 | 显示全部楼层
回复【466楼】climber:
---------------------------------
共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-13 20:43:47 | 显示全部楼层
回复【465楼】龙之谷:
---------------------------------
顶你。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-11-14
在线时间
9 小时
发表于 2015-11-14 14:37:15 | 显示全部楼层
回复【14楼】jermy_z:
---------------------------------
void Beep_Play(uint Time,uint SoundTime, uint QuietTime) 

  for(Time)
    {
      BEEP = 1; 
      delay_ms(SoundTime); 
      BEEP = 0; 
      delay_ms(QuietTime); 
      Time--;
    } 
 }
请问是这样吗?
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-14 17:52:11 | 显示全部楼层
回复【469楼】mq5571:
---------------------------------
这位坛友楼层盖的有点远了,jermy_z兄估计早就忘了那层楼了

C语言基础有待进一步提高啊,好好学习一下for的用法
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-15 00:05:49 | 显示全部楼层
续06-----UCOSII之创建任务、信号量等汇总

    最近有些忙,一直没更新了,加班回到住处静不下来更新,不更新吧又有点手痒,十一点左右终于还是忍不住要找点东西更新一下,于是整理了一下思维中有些紊乱的任务、信号等创建过程,最主要的目的就是汇总比较信号量、邮箱等方面的创建过程便于区别。



【注】1.err一般为自定义的字符型变量(u8 err),一般无实际使用意义;
2.在任务中如果使用到了进入、退出临界段,且进入、退出临界段函数采用方法3实现,需定义u32 cpu_sr;用于进入、退出临界段调用。
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

4

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2013-8-11
在线时间
25 小时
发表于 2015-11-20 21:36:25 | 显示全部楼层
顶楼主,想当初我自学stm32也只是草草而过,虽然现在从事应用技术支持,但学完stm32能更深的了解工业自动化控制过程
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-20 22:03:21 | 显示全部楼层
回复【472楼】holmesds:
---------------------------------
共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-22 22:02:39 | 显示全部楼层
续07-----UCOSII任务操作基础框架

本框架【见附件】在开发指南两个LED任务基础上添加一个BEEPKEY任务,通过对按键操作实现自己添加功能,如对指示灯的挂起、恢复、删除等操作,适合初学UCOSII者的基础练习。

ucosii_01.rar

2.5 MB, 下载次数: 109

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-11-22 22:04:37 | 显示全部楼层
什么时候能到龙哥的水平啊!!!
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-22 23:21:23 | 显示全部楼层
回复【475楼】229382777@qq.com:
---------------------------------
你已经很棒了,加油~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-25 00:47:24 | 显示全部楼层
续08-----ucosii时间管理实验

一、延时函数实现过程
1.配置时钟节拍,即一秒中断多少次,此处配置#define OS_TICKS_PER_SEC       200u   /* Set the number of ticks in one second                        */
2.把Systick的时钟源选择为外部时钟,配合OS_TICKS_PER_SEC对Systick进行配置,使之每1/OS_TICKS_PER_SEC产生一次中断,开启Systick中断,见delay_init()函数;
3.Systick中断中调用OSTimeTick()即ucos时钟服务函数
[mw_shl_code=c,true]#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了. //systick中断服务函数,使用ucos时用到 void SysTick_Handler(void) {     OSIntEnter(); //进入中断 OSTimeTick(); //调用ucos的时钟服务程序 OSIntExit(); //触发任务切换软中断 } #endif[/mw_shl_code]
4.每个任务的任务控制块都有一个任务等待时限(节拍数)的成员,结构体中定义为  INT16U OSTCBDly;  负责任务延时的控制(结构体定义见任哲老师嵌入式实时操作系统ucosii原理及应用52页);
5.OSTimeTick()函数主要作用:一是,给计数器OSTime加1;二是,遍历任务控制块链表中的所有任务控制块,把各个任务控制块中用来存放任务延时时限的OSTCBDly变量减一,直到减到零为止,使已经到了延时时限的非挂起任务进入就绪状态。(函数代码见任哲老师嵌入式实时操作系统ucosii原理及应用99页)。

二、tick变量
1.定义:最小的时钟单位就是两次中断之间相间隔的时间,这个最小的时钟单位叫做时钟节拍(Time Tick);
2.延时函数都是以tick作为参数进行定义使用,其与时间换算如下
[mw_shl_code=c,true]ticks = ((INT32U)hours * 3600uL + (INT32U)minutes * 60uL + (INT32U)seconds) * OS_TICKS_PER_SEC + OS_TICKS_PER_SEC * ((INT32U)ms + 500uL / OS_TICKS_PER_SEC) / 1000uL;[/mw_shl_code]
其中最后500uL/OS_TICKS_PER_SEC为精确延时的时间调整,使不足1个OS_TICKS_PER_SEC的毫秒级延时四舍五入;
3.如前所述,OS_TICKS_PER_SEC
为每秒中断次数,如配置为200,即每秒中断200次(5ms一次),此时使用延时函数void OSTimeDly(INU16U ticks);时,OSTimeDly(1000)即为延时5s。

三、实验简介
使用时间管理函数对任务进行延时,并通过在另一个任务中使用delay_ms()函数对时间管理函数进行参照,另外通过按键来测试结束任务延时。

ucosii_tick.rar

2.52 MB, 下载次数: 104

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-10-29
在线时间
2 小时
发表于 2015-11-25 16:26:58 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-26 00:14:39 | 显示全部楼层
续09-----信号量函数

0.先定义一个信号量
[mw_shl_code=c,true]OS_EVENT *sem;[/mw_shl_code]

1.创建一个信号量函数:OS_EVENT *OSSemCreate(INT16U cnt);

参数含义--①cnt:信号量计数器初始值
[mw_shl_code=c,true]sem = OSSemCreate(0);[/mw_shl_code]

2.等待一个信号量函数:void OSSemPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);

参数含义--①pevent:被请求信号量的指针;②timeout:等待时限;③err:错误信息。
[mw_shl_code=c,true]OSSemPend(sem, 0, &err); //其中err为int8u err;[/mw_shl_code]
每当有任务申请信号时,如果信号量计数器OSEventCnt的值大于0,则把OSEventCnt减1并使任务继续运行;如果OSEventCnt的值为0,则会将任务列入任务等待表OSEventTbl[],而使任务处于等待状态。如果有正在使用信号量的任务释放了该信号量,则会在任务等待列表中找出优先级别最高的等待任务,并在使它就绪后调用调度起引发一次调度,如果任务等待列表中已经没有等待任务,则信号量计数器就只简单的加1。

3.发送一个信号量函数:INT8U OSSemPost(OS_EVENT *pevent);

函数返回:会根据实际情况返回OS_ON_ERR、OS_ERR_EVENT_TYPE或OS_SEM_OVF。
[mw_shl_code=c,true]OSSemPost(sem);[/mw_shl_code]

4.无等待地请求一个信号量函数:INT16U OSSemAccept(OS_EVENT *pevent);

参数含义--①pevent:等待信号量的指针。
[mw_shl_code=c,true]if(OSSemAccept(sem)) { ; } else { ; } //当调用此函数时,如信号量大于零,说明信号量已经就绪,值被返回调用者,信号量的值减一;如果信号量的值为零,则说明信号量没有就绪,返回零值[/mw_shl_code]

5.查询一个信号量的当前状态函数:INT8U OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata);

参数含义--①pevent:信号量指针;②pdata:指向用于记录信号量信息的数据结构OS_SEM_DATA的指针,使用前必须先定义。
[mw_shl_code=c,true]OS_SEM_DATA * sem_query; OSSemQuery(sem, sem_query); //获取信号量sem的信息并存储到sem_query中以供查询[/mw_shl_code]

6.删除信号量函数:OS_EVENT *OSSemDel(OS_EVENT *pevent, INT8U opt, INT8U *err);

参数含义--①pevent:要删除的信号量指针;②opt:删除条件选项;③err:错误信息。
[mw_shl_code=c,true]OSSemDel(sem, opt, err); //删除信号量之前,必须先删除操作此信号量的所有任务,虽然可以通过参数OS_DEL_ALWAYS进行删除,但结果可能是灾难性的。使用此函数具有一定危险性,慎用![/mw_shl_code]

参考/相关链接:
【1】http://aw76.blog.163.com/blog/static/5308144220084240346143/
【2】http://blog.csdn.net/ranruoyu1003/article/details/6447465
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2013-4-26
在线时间
9 小时
发表于 2015-11-26 17:08:51 | 显示全部楼层
楼主还在继续啊! 好毅力!! 顶一个!!!!!!
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-26 17:20:00 | 显示全部楼层
回复【480楼】liulian753:
---------------------------------
共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-4-27
在线时间
3 小时
发表于 2015-11-26 18:46:55 | 显示全部楼层
好久没上网,今天一进来,深深被楼主的毅力所打动,特来一赞
平凡的有点不正常
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-26 18:57:07 | 显示全部楼层
回复【482楼】justin小默:
---------------------------------
共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

3

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2015-3-7
在线时间
43 小时
发表于 2015-11-27 11:02:38 | 显示全部楼层
又来关注了,LZ加油~
为人莫作千年计,三十河东四十西,莫欺少年穷。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-27 11:53:37 | 显示全部楼层
回复【484楼】Mcu_learning:
---------------------------------
共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-28 00:09:58 | 显示全部楼层
续10-----(消息)邮箱

1.(消息)邮箱最多存放一条消息,读出前先存入有效。

2.(消息)邮箱一般由两部分组成:①邮箱;②消息。邮箱作为介质,消息作为实际内容共同实现(消息)邮箱的通信。
[mw_shl_code=c,true]char key = 0; //作为消息用 OS_EVENT *mbox_led0; //作为邮箱用[/mw_shl_code]

3.邮箱一般是用来传递数据的,不管何种类型数据都可以传递。在传递数据时,先将数据用(void*)进行类型转化,使之成为万用类型,而在接收邮箱的数据时,再通过强制类型转换还原成本身的数据类型。


4.OSMboxAccept()函数的调用函数必须检查返回值是否为NULL,如果为NULL,说明邮箱是空的,没有可用消息。如果非NULL,说明邮箱有消息可用,而且返回值得到了该消息(此时与OSMboxPend()效果相同
)。而OSMboxAccept()函数的另一个用途是,用户可以用它来清空一个邮箱现有内容。另,中断服务子程序在试图得到一个消息时,应该使用OSMboxAccept()而非OSMboxPend()。

参考/相关链接
【1】http://wenku.baidu.com/link?url=VJaTWw1qxwyNe9A8lvhOHztUjASlUuJehnWo2fxJgNGKFDnj2brLHmQDInYKOWToVNL0jJf1O3Ow3ftuv-pxR6-xUwH4oxNmjaH7Mm-AJOC
【2】http://www.amobbs.com/forum.php?mod=viewthread&tid=5611604
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

7

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2015-8-17
在线时间
22 小时
发表于 2015-11-28 12:57:56 | 显示全部楼层
顶,楼主是榜样啊。要向楼主学习
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-28 19:57:11 | 显示全部楼层
回复【487楼】我为电子狂:
---------------------------------
共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-11-29 15:40:15 | 显示全部楼层
坚持真不是件易事,特别越到后面,加油
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-29 17:32:59 | 显示全部楼层
回复【489楼】229382777@qq.com:
---------------------------------
越是艰难,收货越大,进一步海阔天空,共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

65

主题

486

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2109
金钱
2109
注册时间
2015-11-14
在线时间
515 小时
发表于 2015-11-30 12:35:34 | 显示全部楼层
回复【490楼】龙之谷:
---------------------------------
90天过了,话说原子哥送了什么给你?
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-30 13:12:18 | 显示全部楼层
回复【491楼】单模先声:
---------------------------------
答案稍后会贴图揭晓,快递正在路上.....
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-30 23:37:11 | 显示全部楼层
续11-----(消息)队列发送函数OSQPend死机问题

1.本来认为队列是邮箱的加强版,学习了基础的邮箱知识应该就能够简单了解队列,结果昨天晚上测试队列却连最基本的OSQPost与OSQPend之间的合作都没有通过,作为初学,着实头大。

2.先说一下昨天大体情况:使用OSQPost发送、OSQPend接收,OSQPost连续发送即第一条未处理完成就发送会导致死机;OSQPend如果延时不为0则直接死机;使用OSQPost发送、OSQAccept接收直接死机。变量、信号量、堆栈分配都没有问题。
今天晚上反复继续测试后发现:使用OSQPostFront代替OSQPost发送,无论哪个函数接收都工作正常。

3.对比os_q.c文件中OSQPostFront函数与OSQPost函数,不同之处如下
①OSQPostFront独有代码
[mw_shl_code=c,true] if (pq->OSQOut == pq->OSQStart) { /* Wrap OUT ptr if we are at the 1st queue entry */ pq->OSQOut = pq->OSQEnd; } pq->OSQOut--; *pq->OSQOut = pmsg; /* Insert message into queue */ pq->OSQEntries++; [/mw_shl_code]
②OSQPost独有代码
[mw_shl_code=c,true] *pq->OSQIn++ = pmsg; /* Insert message into queue */ pq->OSQEntries++; /* Update the nbr of entries in the queue */ if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */ pq->OSQIn = pq->OSQStart; }[/mw_shl_code]
观察以上两处代码可以发现,最大不同应该是OSQPostFront函数中pq->OSQOut先自减再存入消息;而OSQPost函数中pq->OSQIn则是先存入消息再自加,好像顺序是有点不一样。

4.到底是不是顺序引起的呢?我们可以修改一下代码测试一下,把OSQPost函数代码修改如下
[mw_shl_code=c,true]pq->OSQIn++; *pq->OSQIn = pmsg; /* Insert message into queue */ pq->OSQEntries++; /* Update the nbr of entries in the queue */ if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */ pq->OSQIn = pq->OSQStart; }[/mw_shl_code]
先让其自加,再存入消息,经测试,这次果然不死机了,一次存入多个消息也能顺序执行了。

但,经过进一步验证发现,邮箱读完之后
pq->OSQEntries=0,但其中总是存在一条消息,如果上电后(初始状态便于观察)只存入一条消息,不会立刻执行,而是有了第二条之后才执行第一条,即每次邮箱中最后一条消息无法取出,想想修改的地方好像有点明白了,(个人理解)我们是向第二个区域存入第一条消息,但从第一个区域去读第一条消息,这就好比有10个杯子,如果有水指定第一个杯子为起始有水的杯子,却从第二个杯子开始倒水,也就是实际有水的杯子总是滞后约定的顺序,所以取已经倒好水的杯子数量是对的,但取走的有一个空杯子,自然有一个有水的杯子等待着。

5.好吧,既然凭感觉走到这一步了,继续摸索吧。由于队列是环形结构,开始怀疑,pq->OSQStart是特殊位置,可能会比较敏感,所以第四点中先自加后存入消息应该规避了pq->OSQStart区域所以不死机,既然如此,那我们在程序中把这一块规避一下算了
[mw_shl_code=c,true] if(pq->OSQIn == pq->OSQStart) { pq->OSQIn = pq->OSQStart + 1; pq->OSQEntries++; } *pq->OSQIn++ = pmsg; /* Insert message into queue */ pq->OSQEntries++; /* Update the nbr of entries in the queue */ if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */ pq->OSQIn = pq->OSQStart; }[/mw_shl_code]
如以上程序,当位置为pq->OSQStart时,直接向后移动一个位置,且pq->OSQEntries++,即向pq->OSQStart位置放入空消息。

6.至此,OSQPost可以使用了。当然:
①实际使用中,我们一般不要修改ucosii只读文件,避免出现一些意想不到的后果,个人只是学习测试,所以进行一些简单的小改动;
②虽然问题暂时得到解决了,但这并不一定是根源或问题真正症结所在,本次改动也有可能是误打误撞碰巧而已;

③本次小改动是否会对其他地方有不良影响还未可知。
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-12-2 00:43:42 | 显示全部楼层
论坛礼物-----战舰开发板+原子教你玩STM32(寄存器和库函数各一本)

先感谢原子哥及团队提供的开源平台和精典开发板,感谢在学习中的帮助和鼓励.....

晚上加班到八点半,吃完饭洗洗衣服什么的十一点了,一切准备就绪开始打开了.....

(注:个人拍照技术极其一般,这个必须要注一下)

先来个整体外观图



看下图这粗旷不羁的笔体,和我买探索者开发板签的名字一模一样,相信是一人所为,应该是洋哥本人吧



原子教你玩STM32(寄存器和库函数各一本),这包装,好评.....



由于已经有探索者开发板,提前请原子哥把探索者开发板奖品换成同样配置的战舰开发板,结果意想不到的是原子哥额外赠送了礼品(爽到爆,接着往下看)



战舰开发板(左下角小方格有个WIFI模块哦,惊喜一



现在开发板都带亚克力保护了,记得买探索者的时候看到探索者没有配亚克力而些许犹豫,很庆幸没有因为这一点错失,现在配上了,完美.....



以后有时间会在开发板玩一些游戏程序,有买个游戏手柄的打算,战舰开发板盒子底部竟然放着一个游戏手柄(惊喜二,very very nice!!!!!)



上几张合影










这一段时间没有周末,经常加班调试还不是很顺利,打开礼物后这几天的阴郁心情一扫而光,一个字爽.....

乐于分享互助、积极参与学习,下一个晒照的可能就是你哦.....
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-12-2 00:50:58 | 显示全部楼层
回复【494楼】龙之谷:
---------------------------------
呵呵,谢谢分享。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-12-2 00:56:57 | 显示全部楼层
回复【495楼】正点原子:
---------------------------------
非常感谢原子哥礼物和学习过程中的鼓励.....

礼物还带有wifi和游戏手柄,太给力了,爽到爆.....
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-12-2 07:58:13 | 显示全部楼层
恭喜楼主!守得云开见月明。
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-12-2 17:51:41 | 显示全部楼层
回复【497楼】229382777@qq.com:
---------------------------------
共勉,你的状态很好,继续.....
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

11

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
460
金钱
460
注册时间
2014-11-23
在线时间
191 小时
发表于 2015-12-4 16:36:37 | 显示全部楼层
真心佩服楼主!!!
菜鸟不可怕,就怕菜鸟不愿飞 | | | -===+=====_/(T)\_=====+===- | |/.\| | `-|\_/|-'
回复 支持 反对

使用道具 举报

2

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-7-30
在线时间
104 小时
发表于 2015-12-4 21:13:36 | 显示全部楼层
为楼主的毅力点赞,佩服!
不努力,谁也给不了你想要的生活!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 17:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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