OpenEdv-开源电子网

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

希望原子哥搞个FreeRTOS的板块,这个操作系统比ucos用的多啊

  [复制链接]

7

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2015-12-26
在线时间
56 小时
发表于 2016-7-21 16:50:10 | 显示全部楼层 |阅读模式

单选投票, 共有 617 人参与投票
98.54% (608)
0.65% (4)
0.81% (5)
您所在的用户组没有投票权限
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-7-21 17:57:26 | 显示全部楼层
回复

使用道具 举报

70

主题

6696

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12682
金钱
12682
注册时间
2012-11-26
在线时间
3709 小时
发表于 2016-7-21 20:13:37 | 显示全部楼层
国内用freertos的真不是太多
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-7-21 22:42:48 | 显示全部楼层
不知道大家平常开发的时候一般都用什么操作系统呢?
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-7-22 09:09:38 | 显示全部楼层
2015年freertos的市场占有率已经超过了ucos,并跻身嵌入式系统领域榜首了
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2012-1-10
在线时间
237 小时
发表于 2016-7-22 09:18:13 | 显示全部楼层
可以再开个投票,罗列些主流的操作系统,看看大家都是用什么操作系统?
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2016-7-22 22:08:17 | 显示全部楼层
FreeRTOS市场占有率确实非常高,应该有20%
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-7-9
在线时间
15 小时
发表于 2016-7-23 13:53:52 | 显示全部楼层
萌新表示FreeRTOS是什么
回复

使用道具 举报

294

主题

1414

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7791
金钱
7791
注册时间
2015-10-15
在线时间
2858 小时
发表于 2016-7-23 15:02:19 | 显示全部楼层
已经开启。谢谢您的建议。。。 嵌入式操作系统 -》FreeRTOS实时系统
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2015-12-26
在线时间
56 小时
 楼主| 发表于 2016-7-23 23:37:24 | 显示全部楼层
我觉得好荣幸
回复

使用道具 举报

0

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2014-3-5
在线时间
65 小时
发表于 2016-7-25 15:19:49 | 显示全部楼层
Bitcraze的Crazyflie用了FreeRTOS
急不来总有障碍客观的存在...
回复

使用道具 举报

38

主题

248

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
463
金钱
463
注册时间
2011-2-11
在线时间
12 小时
发表于 2016-8-1 09:14:13 | 显示全部楼层
希望大家关注一下trochili rtos,大家可以在这里在线阅读一下代码https://github.com/liuxuming/trochili
Openedv大力支持的开源RTOS  --Trochili RTOS(飞鸟)
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-9-28
在线时间
0 小时
发表于 2016-9-28 11:54:58 | 显示全部楼层
必须支持一下
回复

使用道具 举报

19

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2016-4-9
在线时间
123 小时
发表于 2016-10-1 09:23:21 | 显示全部楼层
ucos获得了工业认证,freertos没有*(但是他的一个子系统认证过),,,如果不是追究商用,我不会选择freertos的   不管怎样ucos上过火星,上过飞机,在安全性有保证
回复

使用道具 举报

19

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2016-4-9
在线时间
123 小时
发表于 2016-10-1 09:26:01 | 显示全部楼层
ucosiii是专门为了cortex核写的 用了计算前导零汇编指令,任务切换要快许多  我对free不太了解,请问free用计算前导零指令了吗?
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-10-2 19:50:03 | 显示全部楼层
本帖最后由 FreeRTOS 于 2016-10-2 19:52 编辑
神秘狼 发表于 2016-10-1 09:26
ucosiii是专门为了cortex核写的 用了计算前导零汇编指令,任务切换要快许多  我对free不太了解,请问free用 ...

不太懂你所说的计算前导零指令,Cortex的指令都是定死的,难道UCOS还能超越硬件限制自己创造出新的指令???freertos的稳定性虽然比不上UCOS,不过任务切换部分采用的的汇编几乎是一样的,把你所说的指令贴出来让大家分析下吧,反正代码就在那里
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

19

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2016-4-9
在线时间
123 小时
发表于 2016-10-2 20:30:03 | 显示全部楼层
FreeRTOS 发表于 2016-10-2 19:50
不太懂你所说的计算前导零指令,Cortex的指令都是定死的,难道UCOS还能超越硬件限制自己创造出新的指令? ...

CPU_CntLeadZeros
        CLZ     R0, R0                          ; Count leading zeros
        BX      LR
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-10-2 21:23:50 | 显示全部楼层
本帖最后由 FreeRTOS 于 2016-10-2 21:26 编辑
神秘狼 发表于 2016-10-2 20:30
CPU_CntLeadZeros
        CLZ     R0, R0                          ; Count leading zeros
        B ...

查了下权威指南,先放上CLZ的定义吧
1.PNG
再放上一个例子:
2.PNG

如果我的理解没错的话,CLZ指令是计算某个字节从左边数起的0的个数,遇到非零位就终止
我看了下UCOS-III的源码,跟任务切换相关的找到下面这个函数:
[mw_shl_code=applescript,true]OS_PRIO  OS_PrioGetHighest (void)
{
    CPU_DATA  *p_tbl;
    OS_PRIO    prio;


    prio  = (OS_PRIO)0;
    p_tbl = &OSPrioTbl[0];
    while (*p_tbl == (CPU_DATA)0) {                         /* Search the bitmap table for the highest priority       */
        prio += DEF_INT_CPU_NBR_BITS;                       /* Compute the step of each CPU_DATA entry                */
        p_tbl++;
    }
    prio += (OS_PRIO)CPU_CntLeadZeros(*p_tbl);              /* Find the position of the first bit set at the entry    */
    return (prio);
}[/mw_shl_code]
先说明下,我没研究过UCOS-III的源码,如有错误的地方请指出哈。
按照我以前对UCOS-II的内核的理解,UCOS有一个任务就绪表,并且这个表每个字节都被对应的任务独占
UCOS在任务切换时会查询这个表是否有任务就绪,按照上面的代码应该就是在查找到已就绪的更高优先级的任务后调用了CPU_CntLeadZeros
来计算前导0的个数,我不知道统计这个对内核有何意义,不过可以肯定的告诉你freertos没有用这条指令,并且内核跟UCOS完全不一样,获取
高优先级的就绪任务时的方式也完全不一样,换句话说吧freertos并不需要计算前导0,因为对内核没啥用
这里提供下UCOS-III的PendSV中断手动切换任务的汇编代码
[mw_shl_code=applescript,true]PendSVHandler_nosave
    PUSH    {R14}                                               ; Save LR exc_return value
    LDR     R0, =OSTaskSwHook                                   ; OSTaskSwHook();
    BLX     R0
    POP     {R14}

    LDR     R0, =OSPrioCur                                      ; OSPrioCur   = OSPrioHighRdy;
    LDR     R1, =OSPrioHighRdy
    LDRB    R2, [R1]
    STRB    R2, [R0]

    LDR     R0, =OSTCBCurPtr                                    ; OSTCBCurPtr = OSTCBHighRdyPtr;
    LDR     R1, =OSTCBHighRdyPtr
    LDR     R2, [R1]
    STR     R2, [R0]

    LDR     R0, [R2]                                            ; R0 is new process SP; SP = OSTCBHighRdyPtr->StkPtr;
    LDM     R0, {R4-R11}                                        ; Restore r4-11 from new process stack
    ADDS    R0, R0, #0x20
    MSR     PSP, R0                                             ; Load PSP with new process SP
    ORR     LR, LR, #0x04                                       ; Ensure exception return uses process stack
    CPSIE   I
    BX      LR                                                  ; Exception return will restore remaining context[/mw_shl_code]
这部分代码跟freertos没太大差别,其实嵌入式操作系统的任务切换原理也基本一致的,也就是利用中断来修改中断返回地址以实现一个人为可控的跳转
个人认为这部分代码也不能完全体现一个系统内核调度,因为在这部分汇编代码里也会调用C函数来执行任务切换的工作,个人认为没多大可比性

最后一点,如果单独从一条汇编指令来断定某个系统的任务调度的快慢,那未免太肤浅了吧。。。
之前有数据对比过,freertos的任务调度速度是比UCOS快一点的,因为freertos内核比较简单,并不像UCOS那么复杂,当然内核越复杂功能和稳定性
也就越强,这也是为何从来没有人质疑过UCOS的地位。
个人愚见,并没有任何冒犯的意思,希望有机会可以多交流,呵呵!
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

19

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2016-4-9
在线时间
123 小时
发表于 2016-10-3 09:56:41 | 显示全部楼层
请问测试是对ucosiii经过裁剪后测试的吗?
回复

使用道具 举报

19

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2016-4-9
在线时间
123 小时
发表于 2016-10-3 09:56:55 | 显示全部楼层
FreeRTOS 发表于 2016-10-2 21:23
查了下权威指南,先放上CLZ的定义吧

再放上一个例子:


请问测试是对ucosiii经过裁剪后测试的吗?
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-10-3 12:01:47 | 显示全部楼层
神秘狼 发表于 2016-10-3 09:56
请问测试是对ucosiii经过裁剪后测试的吗?

并不是对UCOS-III做的测试,要找到准确的测试资料也不容易,可以根据任务切换时的代码量来做大概估算对比,否则只能对比反汇编
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

19

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2016-4-9
在线时间
123 小时
发表于 2016-10-3 16:53:15 | 显示全部楼层
FreeRTOS 发表于 2016-10-3 12:01
并不是对UCOS-III做的测试,要找到准确的测试资料也不容易,可以根据任务切换时的代码量来做大概估算对比 ...

请问freertos是怎么查找已就绪优先级最高的任务的呢?
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-10-3 18:32:10 | 显示全部楼层
本帖最后由 FreeRTOS 于 2016-10-3 18:34 编辑
神秘狼 发表于 2016-10-3 16:53
请问freertos是怎么查找已就绪优先级最高的任务的呢?

freertos使用一个结构体数组 PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];[mw_shl_code=applescript,true]typedef struct xLIST
{
        listFIRST_LIST_INTEGRITY_CHECK_VALUE
        configLIST_VOLATILE UBaseType_t uxNumberOfItems;    // 列表长度,0表示列表为空
        ListItem_t* configLIST_VOLATILE pxIndex;            // 指向链表当前结点的指针
        MiniListItem_t xListEnd;                                    // 链表尾结点(非指针)
        listSECOND_LIST_INTEGRITY_CHECK_VALUE
} List_t;[/mw_shl_code]
每个数组单元管理对应的优先级的任务,例如数组单元1的结构体管理着优先级为1的所有任务(freertos支持任务使用相同优先级)
使用freertos时一定要由用户定义最大的优先级数量 configMAX_PRIORITIES,例如 #define configMAX_PRIORITIES    5
那么用户可以使用的优先级为0~4或1~4(优先级0固定为空闲任务使用,若用户需要与空闲任务共享优先级0,则需要额外配置某个宏)
那么数组 pxReadyTasksLists[] 就只有 pxReadyTasksLists[0] ~ pxReadyTasksLists[4]
freertos规定优先级的数值越大,优先级越高,而且结构体List_t的其中一个单元uxNumberOfItems记录着当前链表长度(同等优先级就绪任务的数量)
因此操作系统只需要检查 pxReadyTasksLists[4].uxNumberOfItems是否为0便知道最高优先级是否有就绪任务
若pxReadyTasksLists[4].uxNumberOfItems == 0,接下来则检查 pxReadyTasksLists[3].uxNumberOfItems,以此类推。。。
当检查到某个优先级n有就绪任务时,pxReadyTasksLists[n].uxNumberOfItems就为非零,接下来直接取出该优先级的任务就绪链表的链表项(就绪任务)执行即可
归纳来讲,如果有10个任务优先级,则freertos每次最多查找10次结构体成员pxReadyTasksLists[].uxNumberOfItems便能按照优先级顺序执行所有任务


UCOS-III的内核听说改了,我记得UCOS-II的内核是必须查找就绪列表的所有单元,例如用户只使用了5个优先级,但操作系统每次必须查找整个就绪列表的64个优先级



拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-5-6
在线时间
5 小时
发表于 2016-10-3 19:39:49 | 显示全部楼层
FreeRTOS 发表于 2016-10-3 18:32
freertos使用一个结构体数组 PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ] ...

神呐,请收下我的膝盖吧,我用FreeRTOS 1年了,也对这玩意的了解也只停留在函数调用层面,没有深究过里面的具体原理,而大神你却对里面内核运作原理什么什么的了如指掌,真想给你跪舔了。
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-10-3 19:53:35 | 显示全部楼层
hhdjz13813 发表于 2016-10-3 19:39
神呐,请收下我的膝盖吧,我用FreeRTOS 1年了,也对这玩意的了解也只停留在函数调用层面,没有深究过里面 ...

本人跑灯的水平,灯渣一枚,呵呵~
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

19

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2016-4-9
在线时间
123 小时
发表于 2016-10-3 22:21:23 | 显示全部楼层
FreeRTOS 发表于 2016-10-3 18:32
freertos使用一个结构体数组 PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ] ...

谢谢你写了这么多字 让我基本明白了freertos内核中任务切换
是的ucosiii不是对ucosii的继承 而是一套全新的内核
回复

使用道具 举报

0

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2016-9-21
在线时间
63 小时
发表于 2016-10-8 10:21:47 | 显示全部楼层
技术人员就是容易扯淡, 在下多数使用 MDK - RTX , 一个工具而已····  
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-26
在线时间
7 小时
发表于 2016-10-8 10:49:29 | 显示全部楼层
FreeRTOS 发表于 2016-10-3 18:32
freertos使用一个结构体数组 PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ] ...

讲的很清晰
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-26
在线时间
7 小时
发表于 2016-10-8 10:51:24 | 显示全部楼层
FreeRTOS 发表于 2016-10-2 19:50
不太懂你所说的计算前导零指令,Cortex的指令都是定死的,难道UCOS还能超越硬件限制自己创造出新的指令? ...

freertos稳定性不好?
我觉得freertos稳定性很好的。
回复

使用道具 举报

cjt518 该用户已被删除
发表于 2016-12-19 21:05:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

12

主题

432

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2012-6-21
在线时间
59 小时
发表于 2017-1-3 10:29:22 来自手机 | 显示全部楼层
再加上emwin
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-1-22 13:02:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-1-22 15:24:00 | 显示全部楼层
charlefu 发表于 2017-1-22 13:02
扯啥呢,ucosII的任务切换只会比freertos快而且可预测。bitmap式的查找最高优先级任务复杂度是o(1),天然 ...

如果没记错的话,UCOSII每次都必须查完整个表,freertos虽然是链表式查询,理论上速度肯定比查表慢,但不妨考虑只有2个任务的情况,UCOSII要查询整个表的64个任务,而freertos只查询2个链表项,这个时间又怎么算?
还有你所说的可预测是什么个意思,还请指教,最好举例详细说明,别像教科书那样说一堆连自己都不懂的知识就好
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-1-22 15:31:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-1-22 15:35:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-1-22 15:43:50 | 显示全部楼层
charlefu 发表于 2017-1-22 15:31
我觉得你下这句话之前去读读ucosii和freertos的调度代码或者百度一下两者的算法说明文章就不会得出这样的 ...

我就是不懂才请教你啊,你还让我自己去找。。。
UCOSII是我研究的第一个RTOS,内核是看过的,没记错的话UCOSII每次TICK中断都会查找整个表的64个任务是否有就绪的,如果你认为不是的话请贴出源码解释下吧,大家也好理解,说教什么的太扯淡了
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-1-22 15:47:05 | 显示全部楼层
charlefu 发表于 2017-1-22 15:35
另外可预测很简单,比如切换一个任务,从任务就绪到完成切换的延迟时间是多少?ucosII可以预估出最坏的情 ...

关于这个可预测还得请教下你,任务就绪到完成任务切换的延时时间,你说UCOSII可以预估最坏的情况,还得问下你这个最坏的情况到底指的是什么?是时间太长么?如果是的话请问内核如何解决这个问题?
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-1-22 15:55:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-1-22 16:05:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-1-22 16:13:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-1-22 16:18:59 | 显示全部楼层
charlefu 发表于 2017-1-22 15:55
UCOSII查询task就绪算法就3句话
Y=OSUnMapTbl[OSRdyGrp];
X=OSUnMapTbl[OSRdyTbl[y]];

这位大兄弟你贴的只是查找最高优先级的算法代码而已,我刚才也说了查表肯定比链表查询要快,但UCOSII的任务切换可不是单纯的“查找最高优先级”那么简单啊下面给你贴出TICK中断的代码吧
[mw_shl_code=applescript,true]void  OSTimeTick (void)
{
    ...略

    ptcb = OSTCBList;                                                                                                                /* 指向TCB链表的第一个TCB */
        while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO)                                                        /* 遍历整个TCB链表 */
                {
            OS_ENTER_CRITICAL();
            if (ptcb->OSTCBDly != 0u)                                                                                        /* 确保任务当前节拍数不为0 */
                        {
                ptcb->OSTCBDly--;                                                                                                /* 任务节拍数-1 */
                if (ptcb->OSTCBDly == 0u)                                                                                /* 判断此时任务节拍数是否为0,若是则任务就绪 */
                                {

                    if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY)
                                        {
                        ptcb->OSTCBStat  &= (INT8U)~(INT8U)OS_STAT_PEND_ANY;        /* Yes, Clear status flag   */
                        ptcb->OSTCBStatPend = OS_STAT_PEND_TO;                                        /* Indicate PEND timeout    */
                    }
                                        else
                                        {
                        ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
                    }

                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY)                /* 检测任务是否被挂起 */
                                        {
                        OSRdyGrp               |= ptcb->OSTCBBitY;                                /* 任务没被挂起,使其就绪 */
                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                    }
                }
            }
            ptcb = ptcb->OSTCBNext;                                                                                                /* 指向TCB链表的下一个TCB */
            OS_EXIT_CRITICAL();
        }
}[/mw_shl_code]
在TICK中断里面UCOSII内核必须对64个TCB的延时进行TICK COUNT,也就是说查找最高优先级只不过是任务调度的其中一环,还有最重要的一环就是TICK COUNT!!!
不知你有没有看这部分源码,有问题可以再交流
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-1-22 16:28:17 | 显示全部楼层
charlefu 发表于 2017-1-22 16:05
简单的说吧,ucos的操作系统函数很多都是o(1)的算法复杂度,换言之这个过程时间是固定的,不管开了多少线 ...

UCOSII的优先级获取确实是固定的,时间可以估算,freertos这个方面是无法估算的,这一点你说的很对。只不过从调度时间来看,UCOSII也没办法保证自己的调度时间比freertos短,最主要的原因就是上面我贴的代码说明,TICK COUNT占用的时间看起来也不少
姑且不对比freertos与UCOSII的任务切换时间,要跟你说明的一点就是freertos将任务延时插入延时链表时进行了排序,延时最少的放在链表前面,最长的放在后面,这样在TICK COUNT时肯定是延时项排在最前面的任务首先被切换,貌似UCOSII并不是以这种方式来获取就绪任务吧
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-1-22 16:29:21 | 显示全部楼层
charlefu 发表于 2017-1-22 16:13
基本上ucosii的目标客户和freertos不一样,重视系统硬实时性的客户会选择ucosii,而注重易用性免费的客户会 ...

UCOSIII我没研究过,就不讨论了,免得出丑
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-1-22 16:48:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-1-22 16:52:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-1-22 17:07:43 | 显示全部楼层
charlefu 发表于 2017-1-22 16:48
实时性并不完全体现在time_tick,time_tick只是最基本都功能而已。更重要的情景是比如一个重要的中断来了 ...

是的呢,对于事件而言只需要找到最高优先级就绪任务即可,我也是据我经验来考虑,比如在串口中断里面立刻通过一个信号量来激活串口接收处理任务,这时候UCOS肯定是占据了绝对的优势。
可能是我在项目当中碰到的情况跟你的不太一样,我碰到比较多的是任务延时结束后由系统切换,虽然也有上面的手动切换任务的情况,但占的比例相对少很多。
UCOSII是以牺牲空间来换取时间,占用的RAM资源比freertos多,这也是为何很多人想尝试在SRAM资源不足4KB的MCU上使用freertos而不考虑UCOS,互有优势吧
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

20

主题

89

帖子

2

精华

高级会员

Rank: 4

积分
576
金钱
576
注册时间
2014-8-3
在线时间
18 小时
发表于 2017-2-3 22:35:36 | 显示全部楼层
神秘狼 发表于 2016-10-2 20:30
CPU_CntLeadZeros
        CLZ     R0, R0                          ; Count leading zeros
        B ...

#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) )

之前把ucosii的源代码全部研究过一遍后,这几天也开始研究FreeRTOS了,首先,FreeRTOS是用到了CLZ指令的,就在这一行里。反而ucosii里没有用到,ucosiii我还没研究过。但是用没用到又不代表这个系统好与不好。ucos与FreeRTOS各有所长,各有特色,不要带有有色眼光去研究代码。
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
发表于 2017-3-14 15:31:34 | 显示全部楼层
FreeRTOS 发表于 2016-10-2 19:50
不太懂你所说的计算前导零指令,Cortex的指令都是定死的,难道UCOS还能超越硬件限制自己创造出新的指令? ...

看见这个帖子,虽然时间很久了 还是注册了账号来评论两句。FreeRTOS怎么会没有CLZ,这就是它的特色啊。http://blog.csdn.net/zhzht198610 ... s/51418383#comments这个帖子写的很好,可以参考。Coretex-M3和Cortex-M4中提供了这个指令。FreeRTOS任务切换的时候,设置一个宏就能会使用CLZ的方式查找最高优先级。另外,对于普通方式的话(就是你说的那种方式),想请教一下,FreeRTOS就是在遍历的搜寻最高优先级的吗?假如有一种极端情况,我设置三个任务1,2,3,对应的优先级分别是1,2,255,任务3被阻塞了,那么寻找最高优先级是不是就要从255找到2呢?还是被阻塞了之后,uxTopReadyPriority就被更新成2了呢?那会不会出现我说的这种类似情况呢?就是搜寻最高优先级要从255搜寻到1呢?
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-3-14 17:11:40 | 显示全部楼层
本帖最后由 FreeRTOS 于 2017-3-14 17:17 编辑

至于你贴的链接,我大概看了下,作者的意思是说通过特殊方法也是可以使用CLZ来查找最高优先级任务的,
我之前一直看FreeRTOS的源码都没留意过有这个,是我孤陋寡闻了,呵呵
另外一个你举例说的有3个任务的优先级分别是1,2,255的情况,根据我之前看FreeRTOS的内核源码,确实是要遍历整个链表数组
但根据你上面提到的可以使用CLZ来查找,这个我就没研究过了,应该是有更快的查找方法吧
下面贴出FreeRTOS V8.2.2查找最高优先级的源码:
1.PNG

拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-3-14 17:20:19 | 显示全部楼层
Edwardwei 发表于 2017-2-3 22:35
#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ...

群里的高手还是很多呵,都研究得很深入,有机会多多交流
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 05:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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