月度归档:2018年03月

LPC1768中断优先级设置

首先,说说中断优先级,所有中断均有一个优先级,

1、 更低的优先级数字代表着更高优先级

2、 除了RESET, Hard fault, NMI等系统级中断,其他所有中断优先级均可配置为”0~31″。

如果软件没有配置这些中断的优先级,那么所有中断的优先级默认为最高优先级”0″。此处 实例说明这个中断优先级的概念,假设三个外部中断”A,B,C”,”A,B”配置为”0″,”C”配置为”1″,

1、 如果三个中断同时产生,那么”A,B”中断优先”C”中断运行。

2、 “A,B”中断同时产生,谁更优先执行呢?那就根据中断向量表的排号,低的优先执行。

3、 若是”C”的中断正在运行,此时”A”的中断发生,那么”A”的中断会抢占”C”的执行权限,优先执行。

4、 若是”A”的中断正在运行,此时”B”的中断发生,那么新产生的”B”中断会进入等待状态,等 待”A”执行完毕再执行。

以上,只是单纯的判断优先级值来控制中断的顺序,为了增强中断的控制逻辑,ARM新增了优先级 组的概念。即相同的优先级等级可以分配在一组优先级内,在这一组优先级内再来定义次优先级,具 体是怎么一个概念呢?还是假设有四个中断”A,B,C,D”,”A,B,C”配置在优先级组”0″内,”A,B”中断配 置次优先级”0″,”C”配置为次优先级”1″,”D”则配置为优先级组”1″

1、 若”A,D”中断同时产生,则优先级高的”A”会优于”D”中断执行。

2、 若”A,C”中断同时产生,则优先级次优先级高的”A”会优先执行。

3、 若”A,B”中断同时产生,则根据中断向量表的位置,排号低的优先执行。

4、 若”D”正在执行中断,此时”A”中断来了,那么”A”中断会抢占”D”中断优先执行。因为”A”所 在的优先级组高于”D”。

5、 若”C”正在执行中断,此时”A”中断来了,那么”A”中断会等待”C”执行完毕再执行。因为属于同一优先级组。

ARM用了一个8位寄存器来定义优先级组和次优先级的概念。中间可以选择一个端点,高位表示有多少个主优先级,低位表示有多少个次优先级。而LPC1769只用了其中5位。

CM3每个中断都有一个优先级寄存器,对LPC1768来说,使用了高5位,低3位固定为0。

clip_image002

在CM3权威指南中

clip_image004

因为LPC1768低3位固定为0,所以优先级分组是从2-7.

clip_image006

最好选择分组2,B7-B3表达抢占优先级,没有子优先级位段。总共可以设置0-31个抢占优先级中断。抢占优先级可以实现中断嵌套。

UDP绑定IP_ADDR_ANY和固定IP的区别

在LWIP中,初始化一个UDP端口

struct udp_pcb *FirstUpcb;

如果绑定控制器的IP,要如下定义:

void First_UdpInit(void)

{

ip_addr_t local_ipaddr;

IP4_ADDR(&local_ipaddr,MyIP[0],MyIP[1],MyIP[2],MyIP[3]);

FirstUpcb = udp_new();

udp_bind(FirstUpcb,&local_ipaddr,FirstUdpport);

udp_recv(FirstUpcb,udp_callback,NULL);

}

MyIP[0],MyIP[1],MyIP[2],MyIP[3]为控制器的IP。

如果绑定IP_ADDR_ANY,如下定义:

void First_UdpInit(void)

{

FirstUpcb = udp_new();

udp_bind(FirstUpcb,IP_ADDR_ANY,FirstUdpport);

udp_recv(FirstUpcb,udp_callback,NULL);

}

当上位机发送一个UDP广播数据:

FF FF FF FF FF FF 00 E0 66 78 3A 84 08 00 45 00 00 2B 2F 01 00 00 40 11 85 FF C0 A8 05 1A FF FF FF FF 27 0E 27 0E 00 17 C5 EA 02 00 0B FF FF FF FF FF FF 31 55 00 FF 90 03

FF FF FF FF FF FF:目的MAC地址,表示是广播

00 E0 66 78 3A 84 :源MAC地址

08 00:帧类型,表示是IP包

以上是14字节以太网首部数据。

45 00 00 2B 2F 01 00 00 40 11 85 FF C0 A8 05 1A FF FF FF FF

是20字节IP首部,其中C0 A8 05 1A是源IP地址,FF FF FF FF是目的IP地址,这里表示是广播地址。

27 0E 27 0E 00 17 C5 EA

是UDP首部

02 00 0B FF FF FF FF FF FF 31 55 00 FF 90 03

是UDP数据。

如果控制器采用第一种方式初始化UDP端口,绑定自己的IP地址,那么不会接收这条UDP命令,因为这条命令的目的IP地址不等于本地IP地址。

如果控制器采用第二种方式初始化UDP端口,绑定IP_ADDR_ANY,控制器会接收到这条命令,UDP的回调函数会处理这条命令。

IP_ADDR_ANY的意思是,只要UDP数据的目的端口和UDP绑定的端口一样,UDP控制块就会处理这条数据,不管这条数据的目的IP是不是发送给本地IP。