Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
关于就绪表
发布于 2014-02-15 16:02:21 浏览:4236
订阅该版
在看rtt的调度器代码时,感觉有点点奇怪: 在src/schedule.c中,以下rt_schedule调度器代码用于查找就绪状态的最高优先级号: ```#if RT_THREAD_PRIORITY_MAX <= 32 highest_ready_priority = __rt_ffs(rt_thread_ready_priority_group) - 1; #else register rt_ubase_t number; number = __rt_ffs(rt_thread_ready_priority_group) - 1; highest_ready_priority = (number << 3) + __rt_ffs(rt_thread_ready_table[number]) - 1; #endif``` rt_schedule对__rt_ffs()返回的值进行减1操作。 在src/kservice.c的__rt_ffs函数中用于查找最低置1位: ```int __rt_ffs(int value) { if (value == 0) return 0; if (value & 0xff) return __lowest_bit_bitmap[value & 0xff] + 1; if (value & 0xff00) return __lowest_bit_bitmap[(value & 0xff00) >> 8] + 9; if (value & 0xff0000) return __lowest_bit_bitmap[(value & 0xff0000) >> 16] + 17; return __lowest_bit_bitmap[(value & 0xff000000) >> 24] + 25; }``` __rt_ffs()对需要返回的值(除0外)进行加1 操作,我对__rt_ffs()和rt_schedule()怪异的操作有点疑问。 问题: 1、__rt_ffs函数对输入参数value进行检查,如果参数为0则返回0,非0时对返回值进行加1操作并在调度器中减1,这样操作是为了与最低位置1(如8'b0000_0001)的情况作区分才对返回值加1操作的? 2、__rt_ffs函数返回0时并没有看到有对0这种情况作检查的代码,如果真的返回0,在number = __rt_ffs(rt_thread_ready_priority_group) - 1代码运行后,bumber的值为0xFFFFFFFF,后续代码依此计算会找不到正确的线程控制块而导致系统崩溃,是否即是设计中的结果?
查看更多
11
个回答
默认排序
按发布时间排序
luckxu
2014-02-15
这家伙很懒,什么也没写!
这样可以不? ``` const rt_uint8_t __lowest_bit_bitmap[] = { /* 00 */ 8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 10 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 20 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 30 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 40 */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 50 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 60 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 70 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 80 */ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 90 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* A0 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* B0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* C0 */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* D0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* E0 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* F0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }; ``` 将位图__lowest_bit_bitmap[0]设置为8(或比8更高的数)。 ``` int __rt_ffs(int value) { if (value & 0xff) return __lowest_bit_bitmap[value & 0xff]; if (value & 0xff00) return __lowest_bit_bitmap[(value & 0xff00) >> 8] + 8; if (value & 0xff0000) return __lowest_bit_bitmap[(value & 0xff0000) >> 16] + 16; return __lowest_bit_bitmap[(value & 0xff000000) >> 24] + 24; } ``` 当value等于0时,__rt_ffs()将会返回32(或比32大的数). ``` #if RT_THREAD_PRIORITY_MAX <= 32 highest_ready_priority = __rt_ffs(rt_thread_ready_priority_group); #else register rt_ubase_t number; number = __rt_ffs(rt_thread_ready_priority_group) ; highest_ready_priority = (number << 3) + __rt_ffs(rt_thread_ready_table[number]) ; #endif ``` rt_schedule调度器计算得到的highest_ready_priority值会大于等于256,结果同样是找不到正确的线程控制块............. 这样做可稍微让调度器少运行几个时钟周期,减少关中断时间。
bernard
2014-02-16
这家伙很懒,什么也没写!
-1操作在于, man ffs: int ffs(int i); The ffs() function returns the position of the first (least significant) bit set in the word i. The least significant bit is position 1 and the most significant position is, for example, 32 or 64. ffs包含了bitmap的软件实现,也包含了CPU指令的“硬件”实现。现在Cortex-M3/M4,大多数情况下已经不使用bitmap的软件实现了。
luckxu
2014-02-16
这家伙很懒,什么也没写!
对不起,我还是不怎么明白,在代码中也没有搜索到int ffs(int i)函数,只找到int __rt_ffs(int value)函数,请再指教指教。 cortex-m3/m4具有RBIT位翻转指令以及CLZ前导0计数指令,可方便用于优先级计算,CLZ指令返回值是从0开始计数,当源数据为0时,CLZ指令返回32。 我的疑问是,采用位图软件实现和Cortex-m3/m4指令情况有些不一致。 假设使用int ffs(int i)实现查找就绪表,那ffs软实现返回值是从1到32,参数为0时返回0;如果采用Cortex-m3/m4指令实现,RBIT和CLZ两条指令返回值是从0到31,参数为0时返回32。为了在实现上保持一致,则指令实现还需要进行一些修改.........
luckxu
2014-02-16
这家伙很懒,什么也没写!
>-1操作在于, >man ffs: >int ffs(int i); >The ffs() function returns the position of the first (least significant) bit set in the word i. The least significant bit is position 1 and the most significant position is, for example, 32 or 64. > >ffs包含了bitmap的软件实现,也包含了CPU指令的“硬件”实现。现在Cortex-M3/M4,大多数情况下已经不使用bitmap的软件实现了。 --- 对不起,我还是不怎么明白,在代码中也没有搜索到int ffs(int i)函数,只找到int __rt_ffs(int value)函数,请再指教指教。 cortex-m3/m4具有RBIT位翻转指令以及CLZ前导0计数指令,可方便用于优先级计算,CLZ指令返回值是从0开始计数,当源数据为0时,CLZ指令返回32。 我的疑问是,采用位图软件实现和Cortex-m3/m4指令情况有些不一致。 假设使用int ffs(int i)实现查找就绪表,那ffs软实现返回值是从1到32,参数为0时返回0;如果采用Cortex-m3/m4指令实现,RBIT和CLZ两条指令返回值是从0到31,参数为0时返回32。为了在实现上保持一致,则指令实现还需要进行一些修改.........
aozima
2014-02-16
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
RT-Thread/libcpu/arm/cortex-m3/cpuport.c ``` int __rt_ffs(int value) { if (value == 0) return value; __ASM("RBIT r0, r0"); __ASM("CLZ r0, r0"); __ASM("ADDS r0, r0, #0x01"); } ```
bernard
2014-02-16
这家伙很懒,什么也没写!
>>-1操作在于, >>man ffs: >>int ffs(int i); >>The ffs() function returns the position of the first (least significant) bit set in the word i. The least significant bit is position 1 and the most significant position is, for example, 32 or 64. >> >>ffs包含了bitmap的软件实现,也包含了CPU指令的“硬件”实现。现在Cortex-M3/M4,大多数情况下已经不使用bitmap的软件实现了。 > >--- > > > > >对不起,我还是不怎么明白,在代码中也没有搜索到int ffs(int i)函数,只找到int __rt_ffs(int value)函数,请再指教指教。 > >cortex-m3/m4具有RBIT位翻转指令以及CLZ前导0计数指令,可方便用于优先级计算,CLZ指令返回值是从0开始计数,当源数据为0时,CLZ指令返回32。 >我的疑问是,采用位图软件实现和Cortex-m3/m4指令情况有些不一致。 >假设使用int ffs(int i)实现查找就绪表,那ffs软实现返回值是从1到32,参数为0时返回0;如果采用Cortex-m3/m4指令实现,RBIT和CLZ两条指令返回值是从0到31,参数为0时返回32。为了在实现上保持一致,则指令实现还需要进行一些修改......... --- 并不是说需要有一个ffs函数,而是说,既然函数命名成__rt_ffs,那么也就代表着这个函数可以作为ffs来使用。如果不一致,则不应该取这个名称。
luckxu
2014-02-16
这家伙很懒,什么也没写!
怒我无知,想问问__rt_ffs函数中,当value为0时返回0是为了满足某种规范或者有什么其它方面的考虑? 如果采用下列代码不是可以精简一些代码(指令)吗? ``` int __rt_ffs(int value) { __ASM("RBIT r0, r0"); __ASM("CLZ r0, r0"); } ```
bernard
2014-02-17
这家伙很懒,什么也没写!
[http://pubs.opengroup.org/onlinepubs/009695399/functions/ffs.html](http://pubs.opengroup.org/onlinepubs/00 ... s/ffs.html)
luckxu
2014-02-17
这家伙很懒,什么也没写!
谢谢
bernard
2014-02-17
这家伙很懒,什么也没写!
其实这块影响也不算太大,关系并不那么大的。关键的还是其他方面的一些优化
撰写答案
登录
注册新账号
关注者
0
被浏览
4.2k
关于作者
luckxu
这家伙很懒,什么也没写!
提问
1
回答
6
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【NXP-MCXA153】 定时器驱动移植
2
GD32F450 看门狗驱动适配
3
【NXP-MCXA153】看门狗驱动移植
4
RT-Thread Studio V2.2.9 Release Note
5
CherryUSB的bootuf2配置
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
9
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部