广告位B招租:1
 2022-04-09T11:37:31.001281    |      实用技巧    |     AilsonJack    |     暂无评论    |     18 views
在Windows 10下执行命令:arp -s 192.168.1.100 00-0a-35-00-01-23会提示:ARP 项添加失败: 拒绝访问,如下图所示:这里我们可以通过下面的操作来添加ARP项。使用netsh命令查看Idx执行如下命令:netsh i i show in得到网卡的Idx值为17,如下图所示:添加静态ARP表项执行如下命令:netsh -c "i i" add neighbors 17 "192.168.1.100" "00-0a-35-00-01-23"注解:命令中的17是上一步操作得到的Idx值。上述命令执行完成之后,通过 arp -a 命令就可以看到静态添加的ARP表项了。删除添加的静态ARP表项如果按照 添加静态ARP表项 章节的内容添加了ARP静态表项,那么就必须使用 netsh 命令来删除添加的静态ARP表项。 arp -d 命令删除了静态表项之后,在系统重启后如果存在之前添加的静态ARP表项的同样的IP地址,即使mac地址不一样,那么被删除的静态ARP表项就会再次存在。执行如下命令:netsh -c "i i" del neighbors 17注解:命令中的17是上一步操作得到的Idx值。上述命令执行完成之后,通过 arp -a 命令就可以看到静态的ARP表项被删除了。
WindowsARP实用技巧 阅读全文»
 2022-02-27T18:32:06.395938    |      C/C++    |     AilsonJack    |     暂无评论    |     15 views
不同体系结构的CPU对于数据在内存中存放的排列顺序规定不同。数据在内存中的存储是以字节(byte)为单位的,因此对于半字(Half-Word)和字(Word)在内存中就有两种存储顺序,分别称为:大端模式(Big Endian)和小端模式(Little Endian)。大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。大端模式的次序就像是我们平时书写的次序,先写大数,后写小数。大端存储次序还广泛运用在TCP/IP协议上,因此又称为网络字节次序。
计算机基础CC++CPU 阅读全文»
 2022-01-24T20:54:25.356201    |      实用技巧    |     AilsonJack    |     暂无评论    |     183 views
JLink使用的芯片:STM32F205RC文章所需资源,请关注我的公众号,发送关键字 "jlink 固件"进行获取(由于是博主手动回复,有时比较慢,谢谢理解!)。1.问题描述在使用JLink v9的时候,不知道怎么回事,突然JLink v9的灯不亮了,将坏了的JLink插上电脑之后,设备管理器中也没有任何反应,连未知设备都没有。最开始以为是JLink被烧了,但细想这个仿真器也没有这么较弱啊,可能是JLink固件出了问题。于是上网查找资料,大致确认是固件出问题了,抱着试试的态度折腾一下吧,折腾不好就算了,万一折腾好了呢。2.准备过程将坏的JLink v9板子上的程序下载接口焊接上,焊接上之后,要清楚这些接口的引脚定义,我这里坏的JLink v9板子的程序下载接口的引脚定义如下:一个小插曲:我买的这个仿真器上面并没有丝印标出各个引脚的定义,问当时购买的商家,也不给我说引脚信息,没办法只好对照着STM32F205RC的引脚手册,使用万用表一个一个的找出各个引脚的定义,最终还真搞出来了。使用一个好的JLink来对坏的JLink烧写丢失的固件。需要将坏的JLink上面刚才焊接的5个接口全部连接到好的JLink对应的引脚上:注意:我这里使用好的JLink的1脚给坏的JLink的STM32F205RC芯片供电,请确保好的JLink的1脚输出3.3V,坏的JLink不需要通过USB接口供电了。3.烧写bootloader将好的JLink连接上电脑,打开J-Flash,然后点击"Other...",用J-Flash打开我提供的"jlink.jflash"文件,打开过程如下:然后点击Target -> Connect,连接上坏的JLink板子上的STM32F205RC芯片,连接上的信息如下:然后将我提供的"bootloader.bin"文件拖入到J-Flash的"Drag & Drop data file here"区域,拖进去的时候会提示起始地址,这里就保持默认值:0x8000000就可以了,点击"OK"按钮:最后烧写bootloader,点击Target -> Production Progamming,完成bootloader的烧写:4.固件修复烧写完成bootloader之后,需要给刚刚修好的JLink更新固件。最好的方法就是用刚修好的JLink连接上一个芯片(我这里连接STM32F429开发板),然后打开J-Link GDB Server连接STM32F429芯片,点击"OK"按钮:之后会弹出固件修复提示窗口,这里接着点击"OK"按钮:接着会弹出固件更新的进度窗口,由于固件更新的比较快,我这里没有截取到图片,固件更新完成之后,就连接上了STM32F429芯片:至此,JLink V9固件修复完成。
嵌入式JLinkJATG实用技巧 阅读全文»
广告位B招租:2
 2021-12-26T13:50:39.242872    |      实用技巧    |     AilsonJack    |     暂无评论    |     89 views
在平时使用JLink仿真器进行调试或者下载程序的时候,经常忘记JLink的引脚定义,索性我在这里记录一下,以便于以后忘记时进行参考。使用JLink的时候,有JTAG模式和SWD模式两种连接方式,自然的,这两种模式的引脚定义也有些许的差异。1.查看引脚图说明下面对JTAG模式和SWD模式引脚图的查看进行一些说明:拿着JLink仿真器,正对着20 PIN引脚的地方,槽口在上面,此时右边上面的引脚是第 1 脚,第 1 脚下面的是第 2 脚,以此类推, 具体的引脚图会在下面进行展示。2.JTAG和SWD模式引脚图JTAG模式的引脚图如下所示:SWD模式的引脚图如下所示:对于SWD模式,主要关注如下引脚:1:VCC4:GND7:SWDIO9:SWCLK15:RESET关于JTAG和SWD模式的VCC引脚,连接的是目标板的电源(3.3V),是目标板给JLink提供的参考电压。
嵌入式JLinkJATGSWD 阅读全文»
 2021-11-28T19:21:16.768395    |      驱动开发    |     AilsonJack    |     暂无评论    |     84 views
在调试芯片的某个外设的时候,如果该外设带有FIFO,那么一般情况下都有FIFO上溢和FIFO下溢的错误标志位,用于表示驱动对外设的FIFO操作是否正确,下面就是FIFO上溢和FIFO下溢对应的概念:FIFO上溢:写满fifo后继续写则导致上溢;FIFO下溢:读空fifo后继续读则导致下溢;如果外设驱动操作外设时出现了FIFO溢出,那么还需要根据手册分析驱动对FIFO的操作是否存在不合理的地方。
驱动开发嵌入式 阅读全文»
 2021-10-29T19:04:46.092336    |      C/C++    |     AilsonJack    |     暂无评论    |     45 views
在程序的开发和调试过程中,可以使用一个宏定义来代替printf输出调试信息,等程序开发完成之后,如果不需要调试信息,直接将宏定义为空就行,这样便于随时打开和关闭调试信息。这样的调试程序的宏一般是可变参数宏,因为打印函数printf是可变参数的,因此定义的宏也要求支持可变参数。可变参数宏可以接受可变数目的参数,就像可变参数的函数一样。可变参数宏也使用三个点(...)来表示宏的可变参数性。__VA_ARGS__ 宏是用来表示可变参数宏的可变参数的内容。简单的说就是将可变参数宏中的 ... 的内容原样传递给右边 __VA_ARGS__ 所在的位置。示例代码如下:通过屏蔽或打开程序中的 __DEBUG__ 宏,可以让调试信息输出或者不输出。
CC++编程语言计算机基础 阅读全文»
广告位B招租:3
 2021-09-26T21:00:10.059909    |      C/C++    |     AilsonJack    |     暂无评论    |     92 views
在编写C程序时,如果想要打印某个字符串,而字符串的内容比较多,这就涉及到对这个长字符串进行书写换行,这里的换行并不会对最终的显示结果进行换行,只是为了阅读代码能够更加的清晰,不至于字符串的内容过长影响代码的阅读体验。1.长字符串示例上述代码需要打印的字符串内容比较长,在代码阅读软件中,可能需要拖动水平方向上的滚动条,才能看清楚字符串的完整内容,这极大的影响了代码的阅读效率。下图是上述代码的运行结果:2.书写长字符串的换行方法方法一:利用双引号对长字符串进行换行在对长字符串进行书写换行时,可以使用双引号将长字符串拆分成多个子字符串,编译器在编译处理时会自动的拼接这些子字符串,不会影响最终想要的显示效果,示例代码如下:上述示例的运行结果如下:运行结果和长字符串未拆分时的效果一样。方法二:利用反斜杠对长字符串进行换行可以使用反斜杠对长字符串进行拆分,反斜杠后的换行符会被C忽略,所以可以拆分字符串,但是下一行的空格会被计算在内,这反斜杠拆分字符串的一个问题吧,示例代码如下:上述代码的运行结果如下图所示:运行结果和最终想要的结果还是有差异的,插入了一些不需要的空格,因为反斜杠拆分的字符串会把下一行的空格也计算在内。3.总结对长字符串的书写换行,建议使用双引号进行拆分,这是最完美的,显示效果和最终想要的效果是一致的。
CC++编程语言计算机基础 阅读全文»
 2021-08-28T00:44:49.857842    |      内核学习    |     AilsonJack    |     暂无评论    |     73 views
根据上一章《Linux内核与驱动学习记录-字符设备驱动程序框架》的内容,这一章编写了一个例程,作为实验进行说明,加深对字符设备驱动程序开发步骤的理解。实验代码如下:Makefile内容如下:将实验代码编译之后的chrdev_frame.ko,下载到板子。加载内核模块,执行命令:sudo insmod chrdev_frame.ko卸载内核模块,执行命令:sudo rmmod chrdev_frame
Linux内核学习驱动开发嵌入式 阅读全文»
 2021-07-31T21:24:33.581477    |      内核学习    |     AilsonJack    |     暂无评论    |     111 views
字符设备的驱动程序开发步骤大致都是差不多的,这里绘制了一张图来形象的反应字符设备驱动程序的关键步骤:我们创建一个字符设备的时候,首先要得到一个设备号,分配设备号的途径有静态分配和动态分配;拿到设备的唯一 ID,我们需要实现 file_operation 并保存到 cdev 中,实现 cdev 的初始化;然后我们需要将我们所做的工作告诉内核,使用 cdev_add() 注册 cdev;最后我们还需要创建设备节点,以便我们后面调用 file_operation接口。注销设备时我们需释放内核中的 cdev,归还申请的设备号,删除创建的设备节点。1.字符设备的定义Linux 内核提供了两种方式来定义字符设备:第一种方式,就是我们常见的变量定义;第二种方式,是内核提供的动态分配方式,调用该函数之后,会返回一个 struct cdev 类型的指针,用于描述字符设备。第二种方式定义的字符设备,可以通过cdev_del函数来释放占用的内存。2.设备号的申请和归还2.1.设备号的静态申请register_chrdev_region 函数用于静态地为一个字符设备申请一个或多个设备编号。int register_chrdev_region(dev_t from, unsigned count, const char *name);参数:from:dev_t 类型的变量,用于指定字符设备的起始设备号,如果要注册的设备号已经被其他的设备注册了,那么就会导致注册失败;count:指定要申请的设备号个数, count 的值不可以太大,否则会与下一个主设备号重叠;name:用于指定该设备的名称,我们可以在/proc/devices 中看到该设备。返回值:返回 0 表示申请成功,失败则返回错误码。2.2.设备号的动态申请使用 register_chrdev_region 函数时,都需要去查阅内核源码的 Documentation/devices.txt 文件,这就十分不方便。因此,内核又为我们提供了一种能够动态分配设备编号的方式: alloc_chrdev_region。调用 alloc_chrdev_region 函数,内核会自动给我们分配一个尚未使用的主设备号。我们可以通过命令“cat /proc/devices”查询内核分配的主设备号。int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);参数:dev:指向 dev_t 类型数据的指针变量,用于存放分配到的设备编号的起始值;baseminor:次设备号的起始值,通常情况下,设置为 0;count:指定要申请的设备号个数, count 的值不可以太大,否则会与下一个主设备号重叠;name:用于指定该设备的名称,我们可以在/proc/devices 中看到该设备。返回值:返回 0 表示申请成功,失败则返回错误码。2.3.设备号的申请(静态和动态都支持)除了register_chrdev_region函数能够静态申请设备号,alloc_chrdev_region函数能够动态申请设备号之外,内核还提供了register_chrdev 函数用于分配设备号。该函数是一个内联函数,它不仅支持静态申请设备号,也支持动态申请设备号,并将主设备号返回。register_chrdev 函数原型如下:参数:major:用于指定要申请的字符设备的主设备号,等价于 register_chrdev_region 函数,当设置为 0 时,内核会自动分配一个未使用的主设备号;name:用于指定字符设备的名称;fops:用于操作该设备的函数接口指针。返回值:主设备号。我们从以上代码中可以看到,使用 register_chrdev 函数向内核申请设备号,同一类字符设备(即主设备号相同),会在内核中申请了256 个,通常情况下,我们不需要用到这么多个设备,这就造成了极大的资源浪费。因此通常情况下,并不使用该函数。2.4.设备号的归还当我们删除字符设备时候,我们需要把分配的设备编号交还给内核,对于使用 register_chrdev_region 函数以及 alloc_chrdev_region 函数分配得到的设备编号,可以使用 unregister_chrdev_region 函数将分配得到的设备号归还给内核。void unregister_chrdev_region(dev_t from, unsigned count);参数:from:指定需要注销的字符设备的设备编号起始值,我们一般将定义的 dev_t 变量作为实参;count:指定需要注销的字符设备编号的个数,该值应与申请函数的 count 值相等,通常采用宏定义进行管理。3.字符设备的初始化cdev_init()函数主要将file_operations结构体和我们的字符设备结构体相关联。void cdev_init(struct cdev *cdev, const struct file_operations *fops);参数:cdev:struct cdev 类型的指针变量,指向需要关联的字符设备结构体;fops:file_operations 类型的结构体指针变量,一般将实现操作该设备的结构体 file_operations 结构体作为实参。4.字符设备的注册和移除4.1.字符设备的注册cdev_add 函数用于向内核的 cdev_map 散列表添加一个新的字符设备。int cdev_add(struct cdev *p, dev_t dev, unsigned count);参数:p:struct cdev 类型的指针,用于指定需要添加的字符设备;dev:dev_t 类型变量,用于指定设备的起始编号;count:指定注册多少个设备。返回值:0或者错误码。4.2.字符设备的移除从内核中移除某个字符设备,则需要调用 cdev_del 函数。从系统中删除 cdev, cdev 设备将无法再打开,但任何已经打开的 cdev 将保持不变,即使在 cdev_del 返回后,它们的 fops 仍然可以调用。void cdev_del(struct cdev *p);参数:p:将已经注册的字符设备结构体的地址作为实参传递进去,就可以从内核中移除该字符设备了。5.设备节点的创建和销毁5.1.设备节点的创建可以在代码中使用device_create函数创建设备节点。参数:class:指向这个设备应该注册到的 struct 类的指针;parent:指向此新设备的父结构设备(如果有)的指针;devt:要添加的字符设备的设备号;drvdata:要添加到设备进行回调的数据;fmt:输入设备名称。返回值:成功时返回 struct device 结构体指针, 错误时返回 ERR_PTR()。5.2.设备节点的销毁可以使用device_destroy函数来删除 device_create 函数创建的设备节点。void device_destroy(struct class *class, dev_t devt);参数:class:指向注册此设备的 struct 类的指针;devt:以前注册设备时,使用的设备号。5.3.使用mknod命令创建设备节点除了使用代码创建设备节点,还可以使用 mknod 命令创建设备节点。用法: mknod 设备名 设备类型 主设备号 次设备号当类型为”p”时可不指定主设备号和次设备号,否则它们是必须指定的。如果主设备号和次设备号以”0x”或”0X”开头,它们会被视作十六进制数来解析;如果以”0”开头,则被视作八进制数;其余情况下被视作十进制数。可用的设备类型包括:b:创建 (有缓冲的) 区块特殊文件;c,u:创建 (没有缓冲的) 字符特殊文件;p:创建先进先出 (FIFO) 特殊文件。如: mkmod /dev/test c 2 0创建一个字符设备/dev/test,其主设备号为 2,次设备号为 0。当我们使用上述命令,创建了一个字符设备文件时,实际上就是创建了一个设备节点 inode 结构体,并且将该设备的设备编号记录在成员i_rdev,将成员 f_op 指针指向了 def_chr_fops 结构体。这就是 mknod 负责的工作内容。inode 上的 file_operation 并不是自己构造的 file_operation,而是字符设备通用的 def_chr_fops,那么自己构建的 file_operation 等在应用程序调用 open 函数之后,才会绑定在文件上。
Linux内核学习驱动开发嵌入式 阅读全文»
广告位B招租:4
广告位B招租:2
广告位B招租:3
广告位B招租:4
  • 1

  本站信息

目前本站共被浏览 125969 次
目前本站已经运行 2645 天
目前本站共有 145 篇文章
目前本站共有 2 条评论信息
目前本站共有 97 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2022年05月05日
广告位E招租
Copyright © 2015~2021  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号