项目使用FreeRTOS,很容易在这个地方出错,所以H7-TOOL的FreeRTOS Trace必须将这个也检索出来才有意义。
由于不知道目标芯片NVIC支持的可编程bit数,Trace检索就比较麻烦,好在FreeRTOS的port.C文件针对这个问题,也做了个特别方法验证。
根据这个实现,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
最终效果:
|