eric2013 发表于 2023-7-6 01:25:05

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

项目使用FreeRTOS,很容易在这个地方出错,所以H7-TOOL的FreeRTOS Trace必须将这个也检索出来才有意义。

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



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

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+内核
}

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 == 0xFFF) then
            p = "Unknow"
                        break
                end
            
      if (list == partno) then
            p = list

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

                        p =NVIC_GROUP .. p .. string.format("r%dp%d\n", rev, patch)

            ulMaxPRIGROUPValue1 = pg_read32(ulMaxPRIGROUPValue) >> 8

            p = p..NVIC_GROUP1 -- 正好对应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


最终效果:



312456990 发表于 2023-7-6 08:11:07

泰库辣{:34:}
页: [1]
查看完整版本: 花了些时间,将FreeRTOS Trace检索中断可以管理的优先级范围也实现了