OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
12
返回列表 发新帖
楼主: 小竹新语

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

  [复制链接]

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
发表于 2017-3-14 17:39:32 | 显示全部楼层
FreeRTOS 发表于 2017-3-14 17:11
至于你贴的链接,我大概看了下,作者的意思是说通过特殊方法也是可以使用CLZ来查找最高优先级任务的,
我 ...

1、对于CLZ这种特殊方法,只能最多32个任务。并且需要硬件支持,但是用这种方法肯定会快一些,毕竟是利用单个汇编指令去完成这个工作的。
2、对于普通方法还有不明白的地方,uxTopReadyPriority这应该是就绪态最高优先级吧,是不是在高优先级任务阻塞的时候,这个值就会被更新成低优先级的任务了呢?但没有找到有这个过程。为什么这么考虑的呢?是因为我想的既然Free是遍历来查找最高优先级任务的,那我改变一下优先级,那么任务的切换时间应该会不同,比如从200优先级的任务切换到1优先级的任务 和10切换到1是不一样的,10切到1应该短一些(当前有个比200优先级任务还高优先级的任务被阻塞了,比如201)。但是没什么效果,时间居然是一样的。让我不理解了。也不知道是不是我的代码放置的地方不对。工位上电脑上不了外网,只能来公用机上网,贴不了代码了 dayede
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-3-14 17:41:19 | 显示全部楼层
根据坛友的指引,终于在FreeRTOS里面找到了这个传说中的CLZ了
原来FreeRTOS的任务切换是根据该宏来选择的:configUSE_PORT_OPTIMISED_TASK_SELECTION
当该宏被定义后,任务切换就会执行以下的代码来获取最高优先级: 2.PNG

其中真正实现最高优先级查找的是这条语句:
3.PNG
里面就调用了CLZ指令,当然这只支持具有CLZ指令的芯片。。。
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
发表于 2017-3-14 17:53:18 | 显示全部楼层
本帖最后由 yuer19900712 于 2017-3-14 17:55 编辑
FreeRTOS 发表于 2017-3-14 17:11
至于你贴的链接,我大概看了下,作者的意思是说通过特殊方法也是可以使用CLZ来查找最高优先级任务的,
我 ...

我是设定三个任务  任务1、2、3 对应优先级 1、2、255.任务3进去就去获取一个信号量,然后阻塞了。任务2获取另一个信号量同样阻塞,进入任务1,任务1中会释放任务2的信号量,我在释放信号量里边加了个启动定时器的程序。D:\新建文件夹

启动定时器

启动定时器

获取时钟周期个数

获取时钟周期个数
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-3-14 18:17:42 | 显示全部楼层
本帖最后由 FreeRTOS 于 2017-3-14 18:56 编辑
yuer19900712 发表于 2017-3-14 17:53
我是设定三个任务  任务1、2、3 对应优先级 1、2、255.任务3进去就去获取一个信号量,然后阻塞了。任务2 ...

刚查了下系统延时的源码,当一个高优先级任务进行延时或者阻塞时,会将自身插入到延时链表里调用
static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely )
而函数里面对最高优先级的变量做了处理:
4.PNG

5.PNG
而uxTopReadyPriority是一个unsigned long类型的变量,每一个位表示一个就绪优先级
当最高优先级任务延时或者阻塞时,对应bit清零

比如你的任务200延时阻塞,那么bit200就会清零,但这仅限于使用CLZ指令的时候,在普通的情况下是不使用这方法的:
1.PNG

至于你的测试方法我还没研究,理论上10-1会比200-1的时间短,还有一个宏需要注意下:configMAX_PRIORITIES
你如果想要更大的优先级,这个宏要做修改




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

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
发表于 2017-3-14 19:06:00 | 显示全部楼层
本帖最后由 yuer19900712 于 2017-3-14 19:15 编辑
FreeRTOS 发表于 2017-3-14 18:17
刚查了下系统延时的源码,当一个高优先级任务进行延时或者阻塞时,会将自身插入到延时链表里调用
static ...

这个你还是应该再看看吧,说的不全对,这还是在特殊处理方式中的,因为CLZ就是用一个bit来当做一个任务的优先级是否被置位的。也就是还是跟硬件有关系。在M0对应文件中是没有portRESET_READY_PRIORITY的实现的。利用CLZ的方式是最多只有32个任务,因为一个字32bit,CLZ指令最多操作一个字
我的程序还是逻辑上的问题。程序写的有点繁琐了。普通方式确实就是在遍历。255优先级任务因为阻塞,执行2优先级的任务,进入2优先级的任务后,uxTopReadyPriority已经被写成2了,所以这个时候改变优先级没什么用处的。可以直接用两个任务来做就行了,高优先级的阻塞,低优先级的测时间就行了。那个宏肯定得修改,不修改程序直接就挂了
还有一个问题,高优先级的任务因为阻塞,uxTopReadyPriority一直在自减,然后变成了低优先级的值,低优先级任务释放信号量之后,高优先级任务再次就绪后,uxTopReadyPriority咋变回来的????
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-3-14 19:59:42 | 显示全部楼层
yuer19900712 发表于 2017-3-14 19:06
这个你还是应该再看看吧,说的不全对,这还是在特殊处理方式中的,因为CLZ就是用一个bit来当做一个任务的 ...

我就是在说明在普通情况下任务阻塞时并没有更新这个变量嘛。。
这么晚了还在工作,果然是狂热者我明天上班再查看下源码,这个问题应该比较好解决
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
发表于 2017-3-14 20:10:50 | 显示全部楼层
本帖最后由 yuer19900712 于 2017-3-14 20:13 编辑
FreeRTOS 发表于 2017-3-14 19:59
我就是在说明在普通情况下任务阻塞时并没有更新这个变量嘛。。
这么晚了还在工作,果然是狂热者我明 ...

这个代码已经找到了,举一个简单例子。比如释放信号量的过程
[mw_shl_code=c,true]#definexSemaphoreGive( xSemaphore )                    \  
                  xQueueGenericSend(                       \  
                                                 ( QueueHandle_t ) ( xSemaphore ), \  
                                                 NULL,                \  
                                                semGIVE_BLOCK_TIME,  \  
                                                queueSEND_TO_BACK )  [/mw_shl_code]
对应的是使用了消息队列的函数
源码如下
[mw_shl_code=c,true]BaseType_t xQueueGenericSend(   
                QueueHandle_t xQueue,   
                const voidvoid * const pvItemToQueue,   
                TickType_t xTicksToWait,   
                const BaseType_t xCopyPosition )  
{  
BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;  
TimeOut_t xTimeOut;  
Queue_t * const pxQueue = ( Queue_t * ) xQueue;  
  
  
    for( ;; )  
    {  
        taskENTER_CRITICAL();  
        {  
            /* 队列还有空闲?正在运行的任务一定要比等待访问队列的任务优先级高.如果使用覆盖式入队,则不需要关注队列是否满*/  
            if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )  
            {  
                /*完成数据拷贝工作,分为从队列尾入队,从队列首入队和覆盖式入队*/  
                xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );  
                  
                /* 如果有任务在此等待队列数据到来,则将该任务解除阻塞*/  
                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )  
                {  
                    /*有任务因等待出队而阻塞,则将任务从队列等待接收列表中删除,然后加入到就绪列表*/  
                    if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )  
                    {  
                        /* 解除阻塞的任务有更高的优先级,则当前任务要让出CPU,因此触发一个上下文切换.又因为现在还在临界区,要等退出临界区后,才会执行上下文切换.*/  
                        queueYIELD_IF_USING_PREEMPTION();  
                    }  
                }  
                else if( xYieldRequired != pdFALSE )  
                {  
                    /* 这个分支处理特殊情况*/  
                    queueYIELD_IF_USING_PREEMPTION();  
                }  
  
  
                taskEXIT_CRITICAL();  
                return pdPASS;  
            }  
            else  
            {  
                if( xTicksToWait == ( TickType_t ) 0 )  
                {  
                    /* 如果队列满并且没有设置超时,则直接退出 */  
                    taskEXIT_CRITICAL();  
  
  
                    /* 返回队列满错误码 */  
                    return errQUEUE_FULL;  
                }  
                else if( xEntryTimeSet == pdFALSE )  
                {  
                    /* 队列满并且规定了阻塞时间,因此需要配置超时结构体对象 */  
                    vTaskSetTimeOutState( &xTimeOut );  
                    xEntryTimeSet = pdTRUE;  
                }  
            }  
        }  
        taskEXIT_CRITICAL();  
  
  
        /* 退出临界区,至此,中断和其它任务可以向这个队列执行入队(投递)或出队(读取)操作.因为队列满,任务无法入队,下面的代码将当前任务将阻塞在这个队列上,在这段代码执行过程中我们需要挂起调度器,防止其它任务操作队列事件列表;挂起调度器虽然可以禁止其它任务操作这个队列,但并不能阻止中断服务程序操作这个队列,因此还需要将队列上锁,防止中断程序读取队列后,使阻塞在出队操作其它任务解除阻塞,执行上下文切换(因为调度器挂起后,不允许执行上下文切换) */  
        vTaskSuspendAll();  
        prvLockQueue( pxQueue );  
  
  
        /* 查看任务的超时时间是否到期 */  
        if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )  
        {  
            if( prvIsQueueFull( pxQueue ) != pdFALSE )  
            {  
                /*超时时间未到期,并且队列仍然满*/  
                vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );  
  
  
                /* 解除队列锁,如果有任务要解除阻塞,则将任务移到挂起就绪列表中(因为当前调度器挂起,所以不能移到就绪列表)*/  
                prvUnlockQueue( pxQueue );  
  
  
                /* 恢复调度器,将任务从挂起就绪列表移到就绪列表中*/  
                if( xTaskResumeAll() == pdFALSE )  
                {  
                    portYIELD_WITHIN_API();  
                }  
            }  
            else  
            {  
                /* 队列有空闲,重试 */  
                prvUnlockQueue( pxQueue );  
                ( void ) xTaskResumeAll();  
            }  
        }  
        else  
        {  
            /* 超时时间到期,返回队列满错误码*/  
            prvUnlockQueue( pxQueue );  
            ( void ) xTaskResumeAll();  
  
  
            traceQUEUE_SEND_FAILED( pxQueue );  
            return errQUEUE_FULL;  
        }  
    }  
}[/mw_shl_code]
在26行的函数是个关键,一直goto,找到最终的代码,会看见就绪最高优先级任务被修改了。回家再贴上详细的。下班
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

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

@yuer19900712
这位大兄弟你貌似找错了位置。。。你贴的是被触发的事件是否比当前任务优先级更高,如果是就返回一个pdTRUE
[mw_shl_code=applescript,true]if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority )
        {
                /* Return true if the task removed from the event list has a higher
                priority than the calling task.  This allows the calling task to know if
                it should force a context switch now. */
                xReturn = pdTRUE

                /* Mark that a yield is pending in case the user is not using the
                "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */
                xYieldPending = pdTRUE;
        }
        else
        {
                xReturn = pdFALSE;
        }[/mw_shl_code]
这段代码跟你问的貌似不大有关系啊。。。

其实对于普通情况(也就是不使用CLZ指令)而言,挂起的任务重新就绪时会重新插入到就绪链表,此时会更新uxTopReadyPriority的值

举个例子吧,在系统时钟中断里会对所有延时的任务进行tick的修正(调用xTaskIncrementTick()函数)
当某个任务延时结束时会重新插入到就绪链表:
[mw_shl_code=applescript,true]/* Place the unblocked task into the appropriate readylist. */
prvAddTaskToReadyList( pxTCB );[/mw_shl_code]
这里才是关键,下面是这个宏的展开:
1.PNG
里面有我们最最熟悉的重新记录最高的优先级:
[mw_shl_code=applescript,true]taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority );[/mw_shl_code]
接着继续展开这个宏:
[mw_shl_code=applescript,true]/* uxTopReadyPriority holds the priority of the highest priority ready
        state task. */
        #define taskRECORD_READY_PRIORITY( uxPriority )                                                                                                                \
        {                                                                                                                                                                                                        \
                if( ( uxPriority ) > uxTopReadyPriority )                                                                                                                \
                {                                                                                                                                                                                                \
                        uxTopReadyPriority = ( uxPriority );                                                                                                                \
                }                                                                                                                                                                                                \
        } /* taskRECORD_READY_PRIORITY */[/mw_shl_code]

任务就绪流程是:操作系统轮询延时链表 ->
                        有任务就绪 ->
                        比较就绪任务与当前的最高优先级并修正uxTopReadyPriority的值 ->
                        将就绪任务插入到就绪链表 ->
                        返回第一步
任务阻塞流程是:当前任务(最高优先级)进入阻塞 ->
                        调用vTaskSwitchContext交出CPU使用权 ->
                        vTaskSwitchContext遍历就绪任务链表数组,从当前优先级开始往下查找下一个就绪任务 ->
                        查找到就绪任务,修正uxTopReadyPriority的值 ->
                        切换到就绪任务

由于我手头上的F0单片机资源有限(只有4KB的SRAM),因此我只用了2个任务做测试,优先级分别为2、9
当优先级为9的任务进入阻塞时,uxTopReadyPriority的值并不会立刻改变,而是先遍历就绪任务链表数组,直到数组元素为2才停止
到此整个任务最高优先级uxTopReadyPriority的值的修改过程已清晰了




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

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-3-15 11:29:08 | 显示全部楼层
yuer19900712 发表于 2017-3-14 20:10
这个代码已经找到了,举一个简单例子。比如释放信号量的过程
[mw_shl_code=c,true]#definexSemaphoreGi ...

至于你昨天说的200-1和10-1的测试,应该是测试的方法不对吧,否则10-1的时间应该会更短
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-3-7
在线时间
1 小时
发表于 2017-5-18 17:57:25 | 显示全部楼层
我学的嵌入式怎么和你们的不太一样。程序不都是WHILE(1)循环查看标志位+中断程序吗
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2017-6-9
在线时间
7 小时
发表于 2017-6-9 13:48:31 | 显示全部楼层
@FreeRTOS @yuer19900712 @charlefu 膜拜几位大神
回复

使用道具 举报

8

主题

569

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2363
金钱
2363
注册时间
2015-5-8
在线时间
320 小时
发表于 2017-7-25 19:23:10 | 显示全部楼层
支持一下
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-8-7 02:03:39 来自手机 | 显示全部楼层
做推广的么?这战打的很有意思,目的性很强
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-8-7 02:08:12 来自手机 | 显示全部楼层
FreeRTOS 发表于 2016-7-22 09:09
2015年freertos的市场占有率已经超过了ucos,并跻身嵌入式系统领域榜首了

有意思没有呢?
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-8-7 02:10:47 来自手机 | 显示全部楼层
FreeRTOS 发表于 2017-3-15 11:29
至于你昨天说的200-1和10-1的测试,应该是测试的方法不对吧,否则10-1的时间应该会更短

做好你的推广就是了,非要带着火药味
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-8-7 08:13:45 | 显示全部楼层
wlq19911021 发表于 2017-8-7 02:10
做好你的推广就是了,非要带着火药味

你说这话就明显带着火药味了,还有资格喷别人?
想教训我请拿出你的实力,本人不接受无脑喷,抱歉!
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2017-7-22
在线时间
16 小时
发表于 2017-8-13 09:04:59 来自手机 | 显示全部楼层
萌新弱弱问一句,嵌入式linux操作系统现在还是主流吗
回复

使用道具 举报

0

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
536
金钱
536
注册时间
2016-11-16
在线时间
48 小时
发表于 2017-8-25 18:30:15 | 显示全部楼层
mark!:lol:lol:lol:lol
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2017-7-10
在线时间
37 小时
发表于 2017-9-1 11:33:03 | 显示全部楼层
现在freertos越来越成熟,今后用的肯定越来越多的
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-9-1
在线时间
15 小时
发表于 2017-9-1 14:56:22 | 显示全部楼层
chenjiabao1994 发表于 2017-5-18 17:57
我学的嵌入式怎么和你们的不太一样。程序不都是WHILE(1)循环查看标志位+中断程序吗

你说的是裸奔,这个是跑系统
回复

使用道具 举报

1

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2017-9-1
在线时间
19 小时
发表于 2017-9-1 16:52:28 | 显示全部楼层
FreeRTOS 发表于 2016-7-22 09:09
2015年freertos的市场占有率已经超过了ucos,并跻身嵌入式系统领域榜首了

支持!
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2017-10-6
在线时间
6 小时
发表于 2017-10-10 16:19:50 | 显示全部楼层
我没有操作系统的概念 怎么弄   看内核 看不懂 ?
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2017-10-6
在线时间
6 小时
发表于 2017-10-10 16:22:41 | 显示全部楼层
学习FreeRTOS 前期需要看什么书籍  现在看代码怎么看不懂
回复

使用道具 举报

8

主题

569

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2363
金钱
2363
注册时间
2015-5-8
在线时间
320 小时
发表于 2017-11-19 10:07:25 | 显示全部楼层
现在一直用Freertos
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-12-12 17:34:38 | 显示全部楼层
神秘狼 发表于 2016-10-1 09:26
ucosiii是专门为了cortex核写的 用了计算前导零汇编指令,任务切换要快许多  我对free不太了解,请问free用 ...

我刚了看源码,我可以肯定的告诉你FreeRTOS在找最高优先级任务的时候既可以用通用的方法,也可以用CLZ快速定位,用CLZ优点是速度快很多,缺点是优先级只能有32级。
回复

使用道具 举报

8

主题

569

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2363
金钱
2363
注册时间
2015-5-8
在线时间
320 小时
发表于 2018-2-27 21:13:09 | 显示全部楼层
支持,最近使用freertos感觉问题多多啊,最好有些具体项目可以学习
回复

使用道具 举报

2

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-3-3
在线时间
7 小时
发表于 2018-3-22 03:23:47 | 显示全部楼层
FreeRTOS 发表于 2016-7-22 09:09
2015年freertos的市场占有率已经超过了ucos,并跻身嵌入式系统领域榜首了

FreeRTOS好像在市占率上早就秒杀了其他OS。内核基本上没槽点,速度很快,基本上是最快的。
最轻量的实用RTOS
https://github.com/EDI-Systems/M5P1_MuProkaron
本人QQ 644580703
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-3-22 08:54:09 | 显示全部楼层
帮顶这样的帖子
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-3-25 19:07:55 来自手机 | 显示全部楼层
FreeRTOS 发表于 2016-10-3 18:32
freertos使用一个结构体数组 PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ] ...

首先谢谢楼主无私奉献对内核的讲解。如你本帖举例,那么五个就绪列表元素pxReadyTasksLists[4]到pxReadyTasksLists[0]就永远要么有0个列表项(我理解xListEnd这个列表项不计入这个列表含有的列表项数目),要么就只有一个:本优先级就绪的那个任务对应的列表项。对吧 这样理解?我的第一个问题是内核什么时候把这个列表项插入这个优先级对应的列表的?我第二个问题是本优先级的其它非就绪任务(好像有阻塞,挂起等?)所对应的列表项也是放在某些列表中的吗?这些列表有哪些?在哪里啊?内核又是如何管理这些不同优先级不同状态的任务呢?靠列表管理吗?列表插入与删除这些代表不同优先级不同状态任务的列表项体现在代码何处? 谢谢了先!
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-3-26 19:22:38 来自手机 | 显示全部楼层
1547674987 发表于 2017-12-12 17:34
我刚了看源码,我可以肯定的告诉你FreeRTOS在找最高优先级任务的时候既可以用通用的方法,也可以用CLZ快 ...

是的 任务创建 函数里面 有个子函数里面用到了前导0指令
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-3-30 10:19:50 | 显示全部楼层
FreeRTOS 发表于 2017-3-14 17:41
根据坛友的指引,终于在FreeRTOS里面找到了这个传说中的CLZ了
原来FreeRTOS的任务切换是根据该宏来选择的 ...

嗯我也看到了 这段使用硬件方法寻找下一个最高优先级的任务,在任务切换那节视频3里讲到过
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2017-10-4
在线时间
13 小时
发表于 2018-7-12 15:13:17 | 显示全部楼层
FreeRTOS 发表于 2016-10-2 21:23
查了下权威指南,先放上CLZ的定义吧

再放上一个例子:

虽然没全部看懂,但还是要顶一下
回复

使用道具 举报

6

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-6-6
在线时间
28 小时
发表于 2018-7-27 17:25:52 | 显示全部楼层
FreeRTOS 发表于 2017-3-14 17:20
群里的高手还是很多呵,都研究得很深入,有机会多多交流

你们知道吗,我一个小白,把这个帖子从头看到尾,还看的特别带劲,虽然不知道你们说啥,就有种特别崇拜的感觉,果然都是大神级别的。上小生,好生羡慕!!!
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2018-9-13 13:24:09 | 显示全部楼层
mark一下
回复

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2012-7-19
在线时间
63 小时
发表于 2018-9-28 14:55:24 | 显示全部楼层
FreeRTOS 发表于 2016-10-2 21:23
查了下权威指南,先放上CLZ的定义吧

再放上一个例子:

这个应该是ucos的任务表查找的特色了,ucos使用所谓的bit map方式查找任务,这样的做法最大的优点就是不需要一个个比较任务到底哪一个就绪,所谓的O(1)和O(n)区别
而这种做法就是要有计算前导零这样的intrinsic指令
回复

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2012-7-19
在线时间
63 小时
发表于 2018-9-28 15:02:42 | 显示全部楼层
pryprypry 发表于 2018-3-22 03:23
FreeRTOS好像在市占率上早就秒杀了其他OS。内核基本上没槽点,速度很快,基本上是最快的。

最快应该是rtx吧
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
发表于 2019-3-29 09:42:39 | 显示全部楼层
yyx112358 发表于 2016-7-21 22:42
不知道大家平常开发的时候一般都用什么操作系统呢?

uc/os  mqx
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2019-5-31
在线时间
24 小时
发表于 2019-11-9 09:04:37 | 显示全部楼层
μOS毕竟收费,大三自学用了一年的μOS,结果大四实习带我的大佬来一句,以后尽量用free rtos吧,μOS以后做项目容易出版权问题
回复

使用道具 举报

5

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2020-7-9
在线时间
69 小时
发表于 2020-9-21 11:48:05 | 显示全部楼层
鸿蒙操作系统的开发板 应该弄一个,凡亿pcb貌似 都做板子了
回复

使用道具 举报

11

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2020-4-22
在线时间
57 小时
发表于 2020-10-19 20:24:14 | 显示全部楼层
一群大佬,看的瑟瑟发抖
回复

使用道具 举报

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2020-8-14
在线时间
14 小时
发表于 2020-12-3 17:10:57 | 显示全部楼层
咱学的嵌入式不太一样啊
回复

使用道具 举报

3

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2019-7-21
在线时间
61 小时
发表于 2021-3-31 10:53:56 | 显示全部楼层
我也支持一下
回复

使用道具 举报

3

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2019-7-21
在线时间
61 小时
发表于 2021-9-1 19:57:35 | 显示全部楼层
支持楼主建议
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2021-11-15 08:32:16 | 显示全部楼层
看了之后  还是很有收获的   正在学习free
Nothing is impossible
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2022-9-21
在线时间
0 小时
发表于 2022-9-22 08:46:49 | 显示全部楼层
关键是免费
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-12-3
在线时间
10 小时
发表于 2023-12-27 13:05:00 | 显示全部楼层
stm32x 发表于 2019-11-9 09:04
μOS毕竟收费,大三自学用了一年的μOS,结果大四实习带我的大佬来一句,以后尽量用free rtos吧,μOS以后 ...

这东西怎么查出来,毕竟不联网。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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