硬汉嵌入式论坛

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

[RTOS Trace] 花了些时间,将FreeRTOS Trace检索中断可以管理的优先级范围也实现了

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-7-6 01:25:05 | 显示全部楼层 |阅读模式
项目使用FreeRTOS,很容易在这个地方出错,所以H7-TOOL的FreeRTOS Trace必须将这个也检索出来才有意义。

由于不知道目标芯片NVIC支持的可编程bit数,Trace检索就比较麻烦,好在FreeRTOS的port.C文件针对这个问题,也做了个特别方法验证。

1245.png

根据这个实现,TOOL Trace对变量ulMaxPRIGROUPValue和ucMaxSysCallPriority做了处理:

[Lua] 纯文本查看 复制代码
NVIC_GROUP = {
    "用户NVIC优先级分组 = Group7, 内核: ", -- 0b000 bxxxxxxx.y 7bit抢占 ulMaxPRIGROUPValue=0
    "用户NVIC优先级分组 = Group6, 内核: ", -- 0b001 bxxxxxx.yy 6bit抢占 ulMaxPRIGROUPValue=1
    "用户NVIC优先级分组 = Group5, 内核: ", -- 0b010 bxxxxx.yyy 5bit抢占 ulMaxPRIGROUPValue=2
    "用户NVIC优先级分组 = Group4, 内核: ", -- 0b011 bxxxx.yyyy 4bit抢占 ulMaxPRIGROUPValue=3
    "用户NVIC优先级分组 = Group3, 内核: ", -- 0b100 bxxx.yyyyy 3bit抢占 ulMaxPRIGROUPValue=4
    "用户NVIC优先级分组 = Group2, 内核: ", -- 0b101 bxx.yyyyyy 2bit抢占 ulMaxPRIGROUPValue=5
    "用户NVIC优先级分组 = Group1, 内核: ", -- 0b110 bx.yyyyyyy 1bit抢占 ulMaxPRIGROUPValue=6
    "用户NVIC优先级分组 = Group0, 内核: ", -- 0b111 b.yyyyyyyy 全子优先级
    "用户NVIC优先级分组 = M0,M0+内核无分组 内核: " -- M0,M0+内核
}


[Lua] 纯文本查看 复制代码
function ReadCore(void)
        local cpuid
        local partno
        local p
        local patch
        local rev
    local group
    local ulMaxPRIGROUPValue1
    local ucMaxSysCallPriority1
        
        local list = 
    {
        {0xC60, "Cortex-M0+"},
        {0xC20, "Cortex-M0"},
        {0xC21, "Cortex-M1"},
        {0xC23, "Cortex-M3"},
        {0xC24, "Cortex-M4"},
        {0xD22, "Cortex-M55"},
        {0xD21, "Cortex-M33"},
        {0xC27, "Cortex-M7"},
        {0xD20, "Cortex-M23"},
        
        {0xD23, "Cortex-M85"},
        
        {0x132, "STAR-MC1"},
        
        {0xFFF, "End"},     --结束标致行
    };
        
        cpuid = pg_read32(0xE000ED00)
    partno = (cpuid >> 4) & 0xFFF

        patch = cpuid & 0x0F
    rev = (cpuid >> 20) & 0x0F
        
    for i = 1, 255, 1 do 
        if (list[i][1] == 0xFFF) then
            p = "Unknow"
                        break
                end
            
        if (list[i][1] == partno) then
            p = list[i][2]

            if((partno == 0xC60) or (partno == 0xC20)) then
                group = 8
            else
                group = pg_read32(0xE000ED0C) -- AIRCR
                group = (group & 0x00000700) >> 8
            end

                        p =NVIC_GROUP[group+1] .. p .. string.format("  r%dp%d\n", rev, patch)

            ulMaxPRIGROUPValue1 = pg_read32(ulMaxPRIGROUPValue) >> 8

            p = p..NVIC_GROUP1[ulMaxPRIGROUPValue1+1] -- 正好对应NVIC优先级非编程bit
            
            ucMaxSysCallPriority1 = pg_read8(ucMaxSysCallPriority)

            ucMaxSysCallPriority1 = ucMaxSysCallPriority1 >> (ulMaxPRIGROUPValue1+1)

            p =p..string.format(", FreeRTOS中断可以管理的优先级范围%d-%d", ucMaxSysCallPriority1, 2^(7-ulMaxPRIGROUPValue1)-1)

            break
        end
    end

    return p
end



最终效果:

12.png

回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

H7 TOOL 大法好!

积分
179
发表于 2023-7-6 08:11:07 | 显示全部楼层
泰库辣
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 07:49 , Processed in 0.163992 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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