你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
查看全部评分
adlu 发表于 2016-12-14 09:15 可能是Cube在优先级上进行了精简,只支持7个优先级。下图是cmsis_os.h中对优先级的定义:
电小龙 发表于 2016-12-14 11:42 那如果我的任务比较多呢?我改怎么设置呢,就算不在cube里面改变,可以在keil中自己定义一个优先级大于3 ...
adlu 发表于 2016-12-14 12:11 这个不是很清楚。只能通过实验验证了。但是最好还是不要改。
绝版森哥 发表于 2018-8-10 09:41 我也遇到楼主这样的问题,楼主最后怎么解决的?
评分
查看全部评分
那如果我的任务比较多呢?我改怎么设置呢,就算不在cube里面改变,可以在keil中自己定义一个优先级大于3的等级吗?
这个不是很清楚。只能通过实验验证了。但是最好还是不要改。
想问问stm32cube设计的人有没有添加这个功能
这个是CUBE自定义的,不用CUBE定义的也行。
这个问题已经过去很久了。但我还是写一下答案吧。有机会自己写一篇。
在cmsis-rtos v1中是通过下面这个函数来转化优先级的:
那么在task.h中规定了它的值。比如stm32cubemx生成的f0的工程中默认取值是:
对于osPriorityNormal来说。这个取值在freeRTOS中的优先级是:tskIDLE_PRIORITY+3
而osPriorityIdle的优先级就是tskIDLE_PRIORITY 这样保证了freeRTOS和cmsis-RTOS的idle优先级的一致。
这一点在优先级较多的时候还行。但对于CM0那种可设置优先级只有4个的任务来说,害死人。(这一点还没有查看代码中有没有保险措施,但如果不加保护,优先级就会乱套。)
但freeRTOS的优先级还不是在真正的优先级。这部分可以查看一下其他人关于freeRTOS的描述。
下面是深入篇。如果你在调试的时候发现显示的优先级和自己设置的不同,不要奇怪。比如keil上面显示的是内核优先级。具体计算可以看下面说明。
另外对于M0内核和M3/M4内核的STM32产品内核优先级的计算是不同的。M0的内核优先级是8位中的高2位可配置。而M3和M4是高4位可配置。
这是core_cm0.h的代码(其中__NVIC_PRIO_BITS的宏定义是2):
这是core_cm4.h的代码(其中__NVIC_PRIO_BITS的宏定义是4):
m4的简单一点,可以看出对于优先级不小于0的中断来说就是将优先级前移4位。
另外在F0的工程中发现没有configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY和configLIBRARY_LOWEST_INTERRUPT_PRIORITY的定义。在cubemx的配置中应该是无效的(但后者可以影响mx自动设置一些中断的优先级。还是要设置。):
具体情况看能否找到官方文档再说。