最近在学习韦东山老师的《嵌入式Linux应用开发》。
在第9章节中,《中断体系结构》
K1,K2,K3,K4分别对应EINT19, EINT11,EINT2,EINT0.
GPIO分别对应K1->GPG11 K2 ->GPG3 K3 ->GPF2 K4 -> GPF0
但是在mini2440用户手册中确是如下所述:
K1 K2 K3 K4 K5 K6
EINT8 EINT11 EINT13 EINT14 EINT15 EINT19
GPG0 GPG3 GPG5 GPG6 GPG7 GPG11
难道这本书里面的板子不是mini2440, 这样不就可能使用按键来测试中断的priority了。 郁闷。
还有, 对里面有一行代码很是费解
/*
*
* 设定优先权
* ARB_SEL0 = 00b, ARB_MODE0 = 0 REQ1 > REQ3, 也就是EINT0 > EINT2
* 仲裁器1, 6无需设置
* 最终
* EINT0 > EINT2 > EINT11, EINT19, 也就是 K4 > K3 > K1, K2 EINT11与EINT19优先权相同。
* 因为EINT11与EINT19通过使用 ARBITER1的REQ1
*/
PRIORITY = (PRIORITY & ( (~0x01) | (0x3 << 7))) | (0x0 << 7);
PRIORITY[20:7]对应7个仲裁器的ARB_SEL位, [7:8]对应ARB_SEL0,以此类推。
PRIORITY[6:1]对应7个仲裁器的ARB_MODE位, [0]对应ARB_MODE0,以此类推。
既然按照他这么说, 我觉得安全可以设置成
PRIORITY = 0;
上面的我分析如下:
步骤1:0x01取反得到如下
31.......................................................................0
0b11111111 11111111 11111111 11111110
步骤2:(~0x01) | (0x3 << 7)
31.........................................................7.............0
0b11111111 11111111 11111111 11111110
0b00000000 00000000 00000001 10000000
或操作结果------------------------------------------------
0b11111111 11111111 11111111 11111110
这步就感觉多余了, 不就是想把PRIORITY中的[0]位设置成0么
步骤3:(PRIORITY & ( (~0x01) | (0x3 << 7)))
从步骤2得到的结果相当于将PRIORITY[0]设置成0了。
步骤4:(PRIORITY & ( (~0x01) | (0x3 << 7))) | (0x0 << 7);
这步就更加荒唐了, 相当于什么都没有做。注视中明明说了要讲ARB_SEL0设置成0x00的。
我估计应该改成:
(PRIORITY & (~0x01) ) & (~(0x3 << 7));
这样就保证了ARB_SEL0设置成了00,以及ARB_MODE0设置成了0
以上是个人理解,希望大家可以展开讨论,看我以上分析是否正确。