一、优先级基本理解
1、CC3200的中断优先级配置类似于STM32,分为抢占式优先级和响应优先级,优先级数值越大,优先级越低。
2、对于抢占式优先级不同的中断,高抢占优先级中断可以打断正在执行的低抢占优先级的中断。这里,我们说他们可以嵌套。
3、但是响应优先级不可以,它不具有“抢占”功能。后到来的中断,如果他和目前正在执行的中断的抢占优先级相同的话,即使响应优先级再高,也无法打断当前中断,只有等待当前中断完成后才会轮到他执行。在抢占优先级相同这个大前提下,响应优先级的作用是,当两个中断同时到来时,较高响应优先级的中断会先得到“响应”,也就是会先执行。
4、如果抢占和响应优先级都一样,那么当同时到来时,就根据他们在中断向量表中的排列顺序决定先执行哪一个。
二、CC3200的优先级原理
1、CC3200中的优先级通过3位二进制数表示,可以表示0-7级的中断。这三位二进制数被抢占优先级和响应优先级共同占有,因此,他们的分配方式有以下四种:
抢占优先级 |
响应优先级 |
0bit |
3bit |
1bit |
2bit |
2bit |
1bit |
3bit |
0bit |
如果用X表示抢占优先级位,Y表示响应优先级位,上面的表格还可以用下面的方式表示:
-
YYY,三位全部表示响应优先级,则一共可分配8级,后面分配的优先级全是响应。
-
XYY,一位抢占,两位响应,则后面可分配2级抢占优先级,4级响应优先级。
-
XXY,依次类推
-
XXX,依次类推
三、CC3200优先级配置
通过上面的分析,具体配置优先级的时候,需要以下两步:
1、设置中断优先级分组,也就是确定你需要几位抢占优先级。
函数原型:
上面这个函数的参数就是你需要的抢占优先级的位数,通过上面的分析可以知道,这里你可以设置为0-3,但是他的允许范围是0-8,因为优先级只有3位,所以输入4-8的效果和3一样。
比如你设置
MAP_IntPriorityGroupingSet(2);
这表示你要使用第二组的优先级,也就是上面说到的XXY,也就是你需要三位二进制数中的两位来表示抢占优先级。所以你后面设置的优先级的级数中,化为二进制时的前两位表示他的抢占优先级,第三位表示响应优先级。也就是说,你可以设置0-4级的抢占优先级,但是每个抢占优先级下面,只能设置2级的响应优先级了。
2、中断优先级设置
函数原型:
第一个参数是你需要配置的中断源
第二个参数就是中断的优先级别了,可以使用库文件中提供的优先级,是下面这8个宏中的一个:
//*****************************************************************************
// Interrupt priority levels
//*****************************************************************************
#define INT_PRIORITY_LVL_0 0x00
#define INT_PRIORITY_LVL_1 0x20
#define INT_PRIORITY_LVL_2 0x40
#define INT_PRIORITY_LVL_3 0x60
#define INT_PRIORITY_LVL_4 0x80
#define INT_PRIORITY_LVL_5 0xA0
#define INT_PRIORITY_LVL_6 0xC0
#define INT_PRIORITY_LVL_7 0xE0
当然,这个优先级的数值也是可以自己定义的:
// Interrupt priorities used within the test.
#define LOW_PRIORITY 0xFF
#define HIGH_PRIORITY 0x00
#define MIDDLE_PRIORITY 0x80
假如前面我们设置有限分组为3,也就是用三位二进制数全部表示抢占优先级,无响应优先级。那么上面我们自己定义的这个优先级:
0X80:前三位二进制数为100,表示抢占优先级为4。
0X00: 前三位二进制数为00,表示抢占优先级为0。
0XFF:前三位二进制数为111,表示抢占优先级为7。
因此,0X00表示的优先级最高,0X88表示的优先级次之,0XFF的优先级最低。而且他们都是抢占优先级,可以实现嵌套。