C
乄失忆丶雨
要想立于不败之地,就得不断学习和努力!
展开
-
PCI驱动框架简单分析
一、PCI 概念介绍 PCI是CPU和外围设备通信的高速传输总线。PCI规范能够实现32位并行数据传输,工作频率为 33MHz 或 66MHz ,最大吞吐率高达266MB/s,PCI的衍生物包括 CardBus、mini-PCI、PCI-Express、cPCI等。 PCI总线体系结构是一种层次式的体系结构。在这种层次体系结构中,PCI桥设备占据着重要的地位,它将父总线与子总线...转载 2019-02-15 17:09:47 · 785 阅读 · 0 评论 -
Linux内核多线程——补充(各种平台下的多线程)
这里主要实现两个线程间通信,当flag = 10 之后通知另外一个线程(也就是“Linux内核多线程(二)”中的程序的各种平台实现)。首先是C++ 11 的方式:#include #include #include #include #include #include using namespace std;const int M = 10;int main()转载 2017-03-06 16:45:05 · 184 阅读 · 0 评论 -
Linux内核多线程(四)
自己创建的内核线程,当把模块加载到内核之后,可以通过:ps –ef 命令来查看线程运行的情况。通过该命令可以看到该线程的pid和ppid等。也可以通过使用kill –s 9 pid 来杀死对应pid的线程。如果要支持kill命令自己创建的线程里面需要能接受kill信号。这里我们就来举一个例,支持kill命令,同时rmmod的时候也能杀死线程。#include #include #inc转载 2017-03-06 16:41:58 · 247 阅读 · 0 评论 -
Linux内核多线程(三)
接上 一篇文章 ,这里介绍另一种线程间通信的方式:completion机制。Completion机制是线程间通信的一种轻量级机制:允许一个线程告诉另一个线程工作已经完成。为使用 completion, 需要包含头文件 。可以通过以下方式来创建一个 completion :DECLARE_COMPLETION(my_completion);或者, 动态创建和初始化:转载 2017-03-06 16:40:01 · 247 阅读 · 0 评论 -
Linux内核多线程(二)
内核多线程是在项目中使用到,自己也不熟悉,遇到一个很囧的问题,导致cpu运行100%。这是写的第一个内核线程程序,通过全局变量来实现两个内核线程之间的通信。但是这里遇到致命错误,就是:每当 wait_event_interruptible()被wake_up_interruptible 唤醒之后线程就进入死循环。后面发现是线程不会主动的自己调度,需要显式的通过schedule 或者 sch转载 2017-03-06 16:37:42 · 273 阅读 · 0 评论 -
Linux内核多线程(一)
Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求)。内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的。内核线程就是内核的分身,一个分身可以处理一件特定事情。内核线程的调度由内核负责,一个内核线程处于阻塞状态时不影响其他的内核线程,因为其是调度的基本单位。这与用户线程是不一样的。因为内核线程只运行在内核态,因此,它只能使用大于PAGE_OFFS转载 2017-03-06 16:35:40 · 259 阅读 · 0 评论 -
vim查看函数原型
首先还是安装,vim不用装了,ubuntu中自带,用到的ctags需要自己安装一下,不要用旧的那个ctags,新的叫Exuberant Ctags,apt安装即可: [plain] view plain copy print?apt-get install exuberant-ctags 然后按照vim.or原创 2017-03-06 15:19:40 · 757 阅读 · 1 评论 -
在VC6.0+WDM开发的错误异常
在VC6.0+WDM开发的错误异常9054DMA_WDMDriver.cppe:\WorkPlace\9054DMA_WDM\driver\9054DMA_WDMDriver.h(14) : error C2059: syntax error : 'bad suffix on number'e:\WorkPlace\9054DMA_WDM\driver\9054DMA_WD原创 2017-02-24 15:06:09 · 488 阅读 · 0 评论 -
linux绑定进程到指定cpu
方法之一:top -p `pidof 进程名称`方法之二:top -p `ps h -o pid -C 进程名称`如果还要查看此进程下的各线程,可用如下:top -H -p `pidof process`----------------------------------------------我是分割线-------------转载 2017-03-03 13:16:01 · 281 阅读 · 0 评论 -
关于调试PLX9054的一些总结和经验
语言:Verilog HDL & C软件环境:Win7 & ISE 14.7硬件:工控机 & PC & Xilinx FPGA & PLX9054调试目的:PLX9054的Local端有3个工作模式:C, J , M。在本次项目中,我们选择了C模式(pin157与pin156接地)。在C模式下有两种数据传输方式,DMA和直接数据传输。我们要往FPGA里先写入一组转载 2017-02-23 14:28:45 · 1141 阅读 · 0 评论 -
配置WINDOWS驱动程序的开发环境-走出第一步
开发我们自己设计的一块板子的PCI设备驱动,并给我指出了方向,具体说就是“三步走”战略:(1)入门。熟悉基于DriverStudio开发环境的设备驱动开发,同时侧面了解PCI设备驱动程序的相关知识。(2)进阶。运用纯DDK进行驱动开发,着重于学习别人的实例,并能熟练进行调试和修改。(3)实战。深入研究PCI总线标准,结合具体的电路板特性开发出一套自己的设备驱动。现在转载 2017-01-17 14:15:10 · 837 阅读 · 0 评论 -
linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式——在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢? 在我们实际内核的移植配置过程中经常听说的内核裁剪又是怎么麽回事呢?我们在进行Linux内核配置的时候经常会执行make menuconfig这个命令,然后屏幕转载 2017-03-07 16:42:04 · 230 阅读 · 0 评论 -
linux驱动基础开发2——linux 驱动开发前奏(模块编程)
一、Linux内核模块简介 linux内核整体结构非常庞大,其包含的组件也非常多。我们怎么把需要的部分都包含在内核中呢? 一种办法是把所有的需要的功能都编译到内核中。这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,不得不重新编译内核,工作效率会非常的低,同时如果编译的模块不是很完善,很有可能会造成内核崩溃。 linu转载 2017-03-07 16:43:25 · 229 阅读 · 0 评论 -
linux驱动基础开发1——linux 设备驱动基本概念
学习linux设备驱动首先我们必须明确以下几个概念,为我们接下来学习linux驱动打下坚实的基础:应用程序、库、内核、驱动程序的关系设备类型设备文件、主设备号与从设备号驱动程序与应用程序的区别用户态与内核态Linux驱动程序功能一、应用程序、库、内核、驱动程序的关系 1)应用程序调用一系列函数库,通过对文件的操作完成转载 2017-03-07 16:45:36 · 151 阅读 · 0 评论 -
基于vxworks的PCI设备驱动编写
自研的PCI板卡写板卡驱动,板卡类型主要为串口卡,AD采集,DA输出,DIO等类型的常用板卡。硬件实现很简单,桥片PXI9054+FPGA结构。因为板卡功能主要为定制,不是商用,所以功能很简单,寄存器定义的很简单,驱动编写相对的很简单。 我使用的vxworks版本号为vxworks6.X, 考虑到兼容性(vxworks5.5),没有使用vxbus总线,另一方面,也没有使用vxbus的必...转载 2019-02-15 16:47:06 · 1785 阅读 · 0 评论 -
VxWorks操作系统shell命令与调试方法总结
目录(?)[+]VxWorks下的调试手段主要介绍在Tornado集成开发环境下的调试方法,和利用支撑定位问题的步骤、思路。1 Tornado的调试工具嵌入式实时操作系统VxWorks和集成开发环境Tornado的组成结构如下图1。分为主机和目标机系统。图1 集成开发环境结构图在Tornado下,调试相关操作在Debug菜单下,包括:图2 Debug菜单简单解释各菜单项的功能1.1...转载 2018-04-19 12:34:58 · 2151 阅读 · 0 评论 -
vxWorks shell命令
vxWorks命令规则:名词+动词,第二个单词开始大写 序号状态命令备注1BSPc改变配置2BSPp打印当前配置信息3BSP@开始加载内核4BSPctrl+x重新启动5BSP6BSP7vxWorksi查看进程8vxWorksifShow查看当前网络设置9vxWorksdevs查看所有的设备10vxWorkscd "/xxx/"进入目录11vxWorkscfIdeInit每次上电后执行12vxW...转载 2018-04-19 12:28:21 · 1331 阅读 · 0 评论 -
精准计算程序或CPU运行时间
精准计算程序或CPU运行时间下面就是计算读寄存器所耗时间:LARGE_INTEGER t1, t2, tc; QueryPerformanceFrequency(&tc); QueryPerformanceCounter(&t1); WORD wNewPos = 0; TG_ReadReg( Handle, 0x100, &wNewPos, 1 );QueryPerforman原创 2017-08-10 09:38:26 · 784 阅读 · 0 评论 -
C语言结构体的对齐原则
C语言结构体的对齐原则Q:关于结构体的对齐,到底遵循什么原则?A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况:#include #include #define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue));#define OFFSET(struct,member原创 2017-06-08 16:31:11 · 342 阅读 · 0 评论 -
将win32程序移植到linux注意事项
对于这个问题,网上已经有很多资料给予了介绍,但是相比于这些信息,本文立足于个人的实践,将内容具体到开发环境和源代码,我觉得还是有很多值得总结和借鉴的。首先声明开发环境。Win32程序的开发环境是VS.NET 2008,编程语言是C;Linux使用的RHEL 5.4,GCC的版本是4.1.2,编程语言也是C。然后依次说明移植的对象:数据类型/字符串处理/系统调用/套接字/进程/进转载 2017-04-27 16:27:19 · 377 阅读 · 0 评论 -
Linux初级驱动执行流程
一、初级驱动执行流程:1、写好Makefile文件,里面包含将应用程序编译成app文件,将驱动程序编译成mydrv.ko文件的脚本2、在Ubuntu里执行sudo make3、确保mydrv.ko和app被拷贝到nfs挂载的根文件系统的/modules目录4、在模块中创建设备节点(在串口软件显示的开发板文件系统里执行) mknod /dev/dcx-drv c转载 2017-04-27 10:32:37 · 508 阅读 · 0 评论 -
一个完整的linux 驱动demo 加应用测试 demo
驱动代码driverdemo.c[cpp] view plain copy print?#include #include #include #include #include #include #include #include #include #incl转载 2017-04-27 09:34:55 · 1040 阅读 · 0 评论 -
linux中mmap系统调用原理分析与实现
1、mmap系统调用(功能) void* mmap ( void * addr , size_t len , int prot , int flags ,int fd , off_t offset ) 内存映射函数mmap, 负责把文件内容映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。转载 2017-03-07 18:25:14 · 218 阅读 · 0 评论 -
linux驱动基础开发0——linux 设备驱动概述
目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer): 主要利用C库函数和Linux API进行应用软件的编写; 从事这方面的开发工作,主要需要学习:符合linux posix标准的API函数及系统调用,linux的多任务编程技巧:多进程、多线程、进程间通信、多任务之转载 2017-03-07 16:46:44 · 181 阅读 · 0 评论 -
PCI9054驱动设计开发
首先是选用开发工具。设备驱动这东东没有工具好像是没有办法做的。一年前我把自己智力估计过高,一头扎进了DDK里面,结果是按照书上做东东,做出来也不明白是什么意思。然后就搁浅了。后来用WinDriver,也没有什么概念性的提高。 现在不做不行了。可选的还有DS,这个与VC结合很好的东东,虽然别人说有这样那样的问题,但是还是有很多人在用。我想就从这里开始吧。 2003-3-1转载 2017-01-17 13:57:29 · 911 阅读 · 0 评论 -
在虚拟机上运行vxWorks
Vxworks是一个嵌入式系统,主要运行在arm、ppc、mips等嵌入式处理器上,它同样可以运行在X86处理器上。风河公司开发的tornado开发环境就包括了pentium版本,并且发布了相应的bsp。因此我们可在vmware虚拟机上运行vxworks,利用虚拟机的功能,我们不需要额外的计算机硬件就可以开始我们的实验。 系统引导计算机系统上电后,首转载 2016-12-20 16:50:00 · 8403 阅读 · 2 评论 -
VxWorks测试题
一. 闭卷考试(1小时30分钟)(一)填空1.假设tornado安装在c: ornado ,那么如果要改一个pentium目标板bootrom下载VxWorks的方式,请问该更改_____目录下的_____文件?2.更改下面的bootline,从True Flash File System中下载VxWorks"fd=0,0(0,0)host:/fd0/vxWorks.s原创 2016-12-20 16:37:58 · 324 阅读 · 0 评论 -
数据在计算机中的存储形式和运算
一、数据概述以C语言为例,里面所有的基本数据类型,都是以符合人类世界和自然世界的逻辑而出现的。比如说int,bool,float等等。这些数据类型出现的目的,是更于让人容易理解,可以说,这些数据类型是架通人类思维 与 计算机的桥梁。我们知道。依照冯诺依曼体系,计算机中并没有这些int float等等,而全部都是0和1表示的二进制数据,并且计算器只能理解这些0和1的数据。所以说转载 2016-12-05 11:43:25 · 1464 阅读 · 0 评论 -
用C标准库中的vsprintf函数自制打印输出函数
C语言中具有不定参数个数的函数定义,因此可以很灵活地定义一些不确定实参个数的函数。像C标准库中的printf函数就是如此。在某些时候,比如在做嵌入式设备,我们自己开发一套打印调试数据的接口(比如通过UART或USB),如果自己完全根据printf中的数据格式来写比较浪费时间和资源。幸亏C语言标准库中提供了vsprintf库函数能够将标准的格式字符串与后面的参数自动组织成printf输出的字转载 2016-12-05 11:24:33 · 751 阅读 · 0 评论 -
守护进程的详细总结(包括实例解析)
1、 守护进程的概念:守护进程(Daemon)是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在Linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,转载 2016-12-12 13:04:58 · 544 阅读 · 0 评论 -
主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs
Part 1: htons函数具体解释 在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序。 在Intel机器下,执行以下程序int main()...{ printf("%d /n",htons(16)); return 0;}得到的结果是4096,初一看感觉很怪。转载 2016-12-02 09:24:00 · 21451 阅读 · 0 评论 -
服务器中判断客户端socket断开连接的方法
下面来罗列一下判断远端已经断开的方法:法一:当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。 法二: struct tcp_info info; in转载 2016-12-01 13:03:20 · 500 阅读 · 0 评论 -
大端模式与小端模式、网络字节顺序与主机字节顺序
大端模式与小端模式一、概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。 先回顾两个关键词,MSB和LSB: MSB:Most Significant Bit ------- 最高有效位 LSB:Least Significant Bit ------- 最低有效位转载 2016-11-30 15:34:59 · 288 阅读 · 0 评论 -
#pragma once与#ifndef两种防止头文件二次编译的区别
在最开始接触到C语言的时候,看到很多大牛们写的代码里面就有#ifndef #define #endif 这三条语句,当时不明白什么意思,慢慢的后来自己也开始用了,也知道了他们合起来使用时为了防止头文件被二次编译,因为我们曾经写代码的过程中一定遇到过等类似的错误吧。到了学习C++的时候,我们老师给我们看他的代码的时候发现他的头文件里用的是#pragma once,就奇怪这是什么呢?然后私下转载 2016-11-30 14:56:43 · 229 阅读 · 0 评论 -
指针数组和数组指针的区别
变量类型判断:变量和哪个关键字先结合,该变量就是什么类型。 例如(1)int (*p)[n]; //p先和*结合,故是一个数组指针 ,即指针指向一个数组(2) int *p[n]; //p先和[n]结合,故是一个指针数组,即数组里面的成员是指针以前这两问题一直都不是很清晰,写程序也管不了这么多,只要不出错能跑出结果就行,其实很多用C的程转载 2016-11-30 14:35:01 · 6619 阅读 · 1 评论 -
setsockopt()函数在VxWorks中的使用说明
setsockopt( )NAMEsetsockopt( ) - set socket optionsSYNOPSISSTATUS setsockopt ( int s, /* target socket */ int level, /* protocol level of option */ int optna原创 2016-11-30 14:13:14 · 3687 阅读 · 0 评论 -
setsockopt 设置socket 详细用法
今天碰到个问题在客户端关闭异常断开的socket之后,想再新建socket来接连server,老是提示10038错误检查了一下,closesocket(conn);conn = INVALID_SOCKET;两步走做了,还是不行。后来发现要添加:struct linger lig;int iLen;lig.l_onoff=1;lig.l_转载 2016-11-30 14:00:09 · 611 阅读 · 0 评论 -
error C1853: “Debug\BigBuffer.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
该错误是因为当项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。在 VC++ 中,默认的预编译头文件是针对 C++ 的 (stdafx.h 和 stdafx.cpp),当然也可以创建针对 C 的预编译头。方法:将少数的不同类文件设为不使用预编译头是比较平衡的做法,方法是:对于 VC++6.0,原创 2016-12-05 15:08:46 · 6470 阅读 · 0 评论 -
临界区锁 InitializeCriticalSection()--- EnterCriticalSection()--LeaveCriticalSection()
[+]1、InitializeCriticalSection此函数初始化一个临界区对象。格式:void InitializeCriticalSection( LPCRITICAL_SECTION lpCriticalSection);转载 2016-12-05 16:04:20 · 383 阅读 · 0 评论 -
C++使用CriticalSection实现线程同步实例
本文实例讲述了C++使用CriticalSection实现线程同步的方法,使用了四个函数:EnterCriticalSection ::DeleteCriticalSection ::EnterCriticalSection ::LeaveCriticalSection此时,打印出来的数字就相等了。具体代码如下:#include "stdafx.h" #include DW原创 2016-12-05 16:54:09 · 323 阅读 · 0 评论