摘要: 以前做项目,不注意记录调试过程中遇到的问题,以后应该注意这一点。今天抽空总结一下PCI-CAN卡驱动与数据通信调试过程中遇到的问题,方便以后回忆和思考。 1. 中断服务之字节流报文组包状态机 这是一个典型的适合采用状态机来思考和处理数据的场合。报文一般分为这几个字段:报文头,长度,命令,数据,校验和。在报文接收端,能看到的只是一连串的字节,这需要状态机的控制。 状态机分这几个状态:(1)接收... 阅读全文
posted @ 2014-05-01 18:54 木椅 阅读(2447) 评论(0) 推荐(0) 编辑
摘要: 1. sprintf 原型:int sprintf( char *buffer, const char *format, [ argument] … ); 功能:将格式化后的字符串写在buffer中,常用于把数字打印在字符串中;连接字符串。 参数:buffer - 待写入缓冲区; format - 与printf一致,格式化字符串 ; 返回值:字符串长度,strlen... 阅读全文
posted @ 2014-05-01 14:37 木椅 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 我们的系统方案是:以9030作为PCI接口芯片,本地端映射了一片IDT70V06的双端口RAM。进行数据传输压力测试时,发现PC机向IDT70V06写数据偶尔会失败。这一问题是什么原因造成的呢? 最初我们设想,可能是PC和MCU同时读写双端口RAM的同一个memory uint. 可是我们用了IDT70V06的Semaphore机制,读写操作都先获取Semaphore,应该不会出问题啊。 写数... 阅读全文
posted @ 2014-04-24 11:08 木椅 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 每个PCI-CAN卡实现了2个CAN通信通道,但共用一个PCI接口(9030)。在windows驱动中,每一个PCI接口只能被某一个进程独占使用,这就意味着:映射在同一块板卡上的2个CAN通道,只能在一个进程中使用;不能在两个进程中,分别操作属于一个板卡的CAN通道。 在驱动接口实现是必须满足一下几个条件: (1)如果板卡已经被某一个进程打开,那么其他进程尝试打开这块板卡时,返回错误; ... 阅读全文
posted @ 2014-04-23 17:31 木椅 阅读(480) 评论(0) 推荐(0) 编辑
摘要: 1. windows驱动分两类,NT式驱动和WDM驱动,后者支持即插即用; 2. DriverEntry是入口函数,传入参数:pDriverObject由IO管理器传入; 3. WDM驱动中,AddDevice创建设备对象,由PnP管理器调用;传入参数:(DriverObject, PhysicalDeviceObject),第一个参数是DriverEntry的传入参数,第二个参数由总线驱... 阅读全文
posted @ 2014-04-23 10:17 木椅 阅读(832) 评论(0) 推荐(0) 编辑
摘要: 1. ping.用来检查网络是否通畅或者网络连接速度的命令. 例如ping 192.168.1.102, ping www.baidu.com, ping PC-MUYI.2. ipconfig. 查看本地TCP/IP的配置信息,ipconfig /all3. arp.ARP是一个重要的TCP/IP... 阅读全文
posted @ 2014-04-23 10:16 木椅 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 有些信息在存储时,并不需要占用一个完整的字节,而只需要一个或几个二进制位即可;比如:在存放一个开关量时,只有0和1两种状态,只需要使用一个二进制位即可存储;为了节省存储空间,C语言提供了一种数据结构,称为"位域"或"位段";所谓"位域"就是把一个字节中的8个二进制位划分为几个不同的区域,并说明每个区... 阅读全文
posted @ 2014-04-15 15:32 木椅 阅读(455) 评论(0) 推荐(0) 编辑
摘要: 最近两天写代码很头大,不停的debug,还是会弹出莫名其妙的runtime error或者illagle memory access。 采用MFC写的程序,除了主线程又创建了定时器回调线程。定时器回调线程定期的对共享数据资源进行访问读写,主界面响应用户输入和申请释放资源。问题产生了!2个线程过多的资... 阅读全文
posted @ 2014-04-15 14:55 木椅 阅读(2495) 评论(0) 推荐(1) 编辑
摘要: 1.配置EEPROM. 使用PlxMon打开9030,基本修改Spacex(0,1,2,3), Chip selectx(0,1,2,3), 中断状态INTCSR(0x74), 其他(0x78),详细说明一下。(1)Spacex、Chip Selectx首先明确使用哪几个本地地址空间(9030本地端几个RAM?硬件连接几根CS信号线?),例如硬件将CS0信号连接RAM1,CS2信号连接RAM2,那么你需要配置Space0和Space2. 4个Space的配置方法一样,看你需要哪个就配置哪个,不需要的禁用之。举例:我的硬件CS0挂了一片16KB的RAM1,本地总线8数据位宽,CS1挂了4K的RA 阅读全文
posted @ 2014-04-12 19:50 木椅 阅读(1101) 评论(0) 推荐(0) 编辑
摘要: 1.一定不要在没有标注I/O请求数据包(IRP)挂起(IoMarkIrpPending)的情况下通过调度例程返回STATUS_PENDING。2.一定不要通过中断服务例程(ISR)调用KeSynchronizeExecution。它会使系统死锁。3.一定不要将DeviceObject->Flags设置为DO_BUFFERED_IO和DO_DIRECT_IO。它会扰乱系统并最终导致致命错误。而且,一定不要在DeviceObject->Flags中设置METHOD_BUFFERED、METHOD_NEITHER、METHOD_IN_DIRECT或METHOD_OUT_DIRECT,因为 阅读全文
posted @ 2014-04-10 16:55 木椅 阅读(500) 评论(0) 推荐(0) 编辑