硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1317|回复: 5
收起左侧

[Lua] LUA做一个各种状态获取API,当前使用if else做的,感觉有点low

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
发表于 2023-1-7 01:39:59 | 显示全部楼层 |阅读模式


当前实现代码,想把它修改了,考虑改成table试试

[Lua] 纯文本查看 复制代码
function GetTaskState(Value)
    local reStr

    if(Value == 0) then
    reStr = "osInactive"
    elseif(Value == 1) then
        reStr = "osReady"
    elseif(Value == 2) then
        reStr = "osRunning"
    elseif(Value == 3) then
        reStr = "osBlocked"
    elseif(Value == 4) then
        reStr = "osTerminated"
    elseif(Value == 0x13) then
        reStr = "osWaitDelay"
    elseif(Value == 0x23) then
        reStr = "osWaitDelay"
    elseif(Value == 0x33) then
        reStr = "osWaitDelay"
    elseif(Value == 0x43) then
        reStr = "osWaitThreadFlags"
    elseif(Value == 0x53) then
        reStr = "osWaitMutex"
    elseif(Value == 0x63) then
        reStr = "osWaitSem"
    elseif(Value == 0x73) then
        reStr = "osWaitMemPool"
    elseif(Value == 0x83) then
        reStr = "osWaitMsgGet"
    elseif(Value == 0x93) then
        reStr = "osWaitMsgPut"
    end

    return reStr
end

回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-1-7 08:45:33 | 显示全部楼层
直接键值对
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
 楼主| 发表于 2023-1-7 16:21:44 | 显示全部楼层

对改成这种方式了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
 楼主| 发表于 2023-1-7 16:22:09 | 显示全部楼层
做了个,但效率跟if else区别不大
[Lua] 纯文本查看 复制代码
TaskStateTable = 
{
    0,       "osInactive",
    1,       "osReady",
    2,       "osRunning",
    3 ,      "osBlocked",
    4,       "osTerminated",
    0x13,    "osWaitDelay",
    0x23,    "osWaitDelay",
    0x33,    "osWaitDelay",
    0x43,    "osWaitThreadFlags",
    0x53,    "osWaitMutex",
    0x63,    "osWaitSem",
    0x73,    "osWaitMemPool",
    0x83,   "osWaitMsgGet",
    0x93,   "osWaitMsgPut",
}

function GetTaskState(Value)
    local reStr
    local i
    for i=1,14,1 do
        if(Value == TaskStateTable[2*i-1]) then
            reStr =  TaskStateTable[2*i]
            print(reStr)
            break
        end
    end
end

GetTaskState(0)
GetTaskState(1)
GetTaskState(2)
GetTaskState(3)
GetTaskState(4)
GetTaskState(0x13)
GetTaskState(0x23)
GetTaskState(0x33)
GetTaskState(0x43)
GetTaskState(0x53)
GetTaskState(0x63)
GetTaskState(0x73)
GetTaskState(0x83)
GetTaskState(0x93)


image.png


回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-1-7 19:17:00 | 显示全部楼层
我这么写看起来很简洁,但是有数字到字符串的转换过程以及表的键类型是字符串,效率比你的低,都用脚本了,我有时候就不想去关系效率了,能用就行
要优化速度的话感觉可以在H7Toools的源码里直接用C写LUA的接口,LUA里调用这个接口才是最快
[Lua] 纯文本查看 复制代码
TaskStateTable = {}
TaskStateTable[   "0" ] = "osInactive"
TaskStateTable[   "1" ] = "osReady"
TaskStateTable[   "2" ] = "osRunning"
TaskStateTable[   "3" ] = "osBlocked"
TaskStateTable[   "4" ] = "osTerminated"
TaskStateTable[  "19" ] = "osTerminated"        -- 0x13
TaskStateTable[  "35" ] = "osWaitDelay"         -- 0x23
TaskStateTable[  "51" ] = "osWaitDelay"         -- 0x33
TaskStateTable[  "67" ] = "osWaitThreadFlags"   -- 0x43
TaskStateTable[  "83" ] = "osWaitMutex"         -- 0x53
TaskStateTable[  "99" ] = "osWaitSem"           -- 0x63
TaskStateTable[ "115" ] = "osWaitMemPool"       -- 0x73
TaskStateTable[ "131" ] = "osWaitMsgGet"        -- 0x83
TaskStateTable[ "147" ] = "osWaitMsgPut"        -- 0x93

function GetTaskState ( Value )
	print( TaskStateTable[ tostring(Value) ] )
end

GetTaskState( 0 )
GetTaskState( 5 )
GetTaskState( 147 )
GetTaskState( 0x93 )
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
 楼主| 发表于 2023-1-8 01:04:32 | 显示全部楼层
tovinz 发表于 2023-1-7 19:17
我这么写看起来很简洁,但是有数字到字符串的转换过程以及表的键类型是字符串,效率比你的低,都用脚本了, ...

谢谢分享,这方法也不错
image.png


回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 20:51 , Processed in 0.487906 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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