sxf_zero
sxf_zero

注册于 10 years ago

回答
0
文章
0
关注者
0

继续留脚印,进不了中断的问题解决了,就是上面的原因,还发现了个小bug,导致波特率设置不正确。
文件:bxcan.c
位置:494行-498行

 pcan->BTR = (mode                         | 
((BAUD_DATA(SJW, baud_index)) << 24) |
((BAUD_DATA(BS1, baud_index)) << 16) |
((BAUD_DATA(BS2, baud_index)) << 20) |
(BAUD_DATA(RRESCL, baud_index)));


498行改为 :
 (BAUD_DATA(RRESCL, baud_index))-1);

就ok了。

楼主搞的怎么样了,今天用F103的板子搞这个驱动,怎么也进不了can中断,晚上突然就想起这个了

1、对于非互联型的片子,如stm32f103,
USB_LP_CAN1_RX0_IRQn FIFO0接收邮箱中断
CAN1_RX1_IRQn FIFO1接收邮箱中断
USB_HP_CAN1_TX_IRQn 发送中断

2、对于互联型产品如,105,107,

CAN1
CAN1_RX0_IRQn FIFO0接收邮箱中断
CAN1_RX1_IRQn FIFO1接收邮箱中
CAN1_TX_IRQn 送中断

CAN2
CAN2_RX0_IRQn FIFO0接收邮箱中断
CAN2_RX1_IRQn FIFO1接收邮箱中
CAN2_TX_IRQn 发送中断

应该是这个原因,bxcan.c是默认是基于105的互联型片子,103的can1中断函数名和105,107的是有所差别的,明天改下看看。

	  if (netif_default != RT_NULL)
{
struct ip_addr ipaddr, netmask, gw;

IP4_ADDR(&ipaddr, apcfg->DriveIP[0], apcfg->DriveIP[1], apcfg->DriveIP[2], apcfg->DriveIP[3]);
IP4_ADDR(&gw,apcfg->DriveGateWay[0], apcfg->DriveGateWay[1], apcfg->DriveGateWay[2],apcfg->DriveGateWay[3]);
IP4_ADDR(&netmask, apcfg->DriveIPMASK[0], apcfg->DriveIPMASK[1],apcfg->DriveIPMASK[2], apcfg->DriveIPMASK[3]);


netifapi_netif_set_addr(netif_default, &ipaddr, &netmask, &gw);

rt_kprintf("ip=%d.%d.%d.%d
",apcfg->DriveIP[0], apcfg->DriveIP[1], apcfg->DriveIP[2], apcfg->DriveIP[3]);
rt_kprintf("gw=%d.%d.%d.%d
",apcfg->DriveGateWay[0], apcfg->DriveGateWay[1], apcfg->DriveGateWay[2], apcfg->DriveGateWay[3]);
rt_kprintf("mask=%d.%d.%d.%d
",apcfg->DriveIPMASK[0], apcfg->DriveIPMASK[1], apcfg->DriveIPMASK[2], apcfg->DriveIPMASK[3]);
}


修改IP时用的就是上面的代码,

103ze+enc28j60 调通了,不过还有点小问题,运行时修改IP不成功,同样的方式在f107上能成功,应该还是驱动的问题吧,正在找原因

楼主测试了吗?我试了下,好像有问题,不通啊

我看那个开源的串口转以太网的项目是这样设置的

#define RT_LWIP_ETHTHREAD_PRIORITY 5
#define RT_LWIP_ETHTHREAD_MBOX_SIZE 48
#define RT_LWIP_ETHTHREAD_STACKSIZE 1024

#define RT_LWIP_TCPTHREAD_PRIORITY 6
#define RT_LWIP_TCPTHREAD_MBOX_SIZE 8
#define RT_LWIP_TCPTHREAD_STACKSIZE 4096

#define RT_LWIP_TCP_MSS 100
#define RT_LWIP_TCP_SND_BUF 400
#define RT_LWIP_TCP_WND RT_LWIP_TCP_MSS
想知道这样设置的道理,是计算推算的?还是经过尝试的经验值?

这段时间,如果唤醒任务会是优先级最高的就绪任务,这段时间是确定的。


具体是多长时间呢,最长需要多长时间,

另外看 1.0版中多了个 rt_mb_send_wait,如果指定超时时间的话,也不能用在中断中吧

线程产生数据,想通过中断方式发出去,所以想到用邮箱或者消息队列

能不能实现这样的功能,指定要读取的消息数量,返回值为实际读取到的数量

假如你去写这样一个,不也还是一次收取一个,直到为空?
和原来又有何区别?


在接收线程中,阻塞等待消息队列,接收1个消息,处理,处理过程中有些费时,但是处理1个消息和处理n个消息用的时间开销差不多,如果一次处理1个消息就会浪费大量时间在处理消息上,在处理消息的过程中,中断服务又向消息队列发送消息,这时很容易造成消息队列满,在消息队列满或者消息数目大于一的情况下,一次只能取1条消息,就不能很好的起到缓冲的作用

能不能实现这样的功能,指定要读取的消息数量,返回值为实际读取到的数量

发布
问题