- 博客(35)
- 资源 (1)
- 收藏
- 关注
原创 Linux应用编程记录(二)
提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
2023-06-28 09:46:00
366
原创 Linux学习——标准I\O库
标准I/O库函数是构建于文件I/O(open()、read()、write()、lseek()、close()等)这些系统调用之上的。虽然标准I/O和文件I/O都是C语言函数,但是标准I/O是标准C库函数,而文件I/O则是Linux系统调用。标准I/O是由文件I/O封装而来的。可移植性上,标准I/O相比于文件I/O具有更好的可移植性。标准I/O是带有缓存的,而文件I/O是在用户空间不带有缓存,所以标准I/O相比于文件I/O在性能上、效率上更优。待补充。
2023-06-28 09:42:42
281
原创 jlink GDB Server GDB调试STM32
使用jlink GDB Server调试STM32代码,工程来源,STM32 Cube Mx ,中间错误频出,记录一下。
2022-11-10 22:32:54
2667
原创 GD32F450平台上跑rtthread时,JLINK通过RTT控制块进行VIWER
通过Segger-jlink viwer软件进行输出,可以输出调试日志等方便调试注意RTT源码要确定被编译!
2022-09-01 15:11:16
660
原创 Makefile 的使用说明与相关概念介绍(目标和依赖)
在实际的工程编译中,代码往往不是一个人完成的,即使是一个人完成的,也不是在一个.C文件中写完了所有功能,所以在多个模块化的功能,以及多个.C文件进行编译的时候,当项目多方协作的时候,无法使用IDE软件,例如KEIL等,就需要使用到Makefile进行编译。Makefile的使用需要根据使用经验进行积累,前期要对Makefile的相关概念有所了解。具体概念根据实际情况对不懂的地方进行查阅。本文从以工作过程中对依赖部分没有理清为实际入手点,针对性的进行了相关的学习,做了如下的学习记录,仅供参考!...
2022-08-31 15:01:31
1004
原创 高级I/O(一)
介绍文件I/O当中的一些高级用法,以应对不同应用场合的需求,主要包括:非阻塞I/O、I/O多路复用、异步I/O、存储映射I/O以及文件锁关于阻塞和非阻塞的理解:如对于某些文件类型(读管道文件、网络设备文件和字符设备文件),当对文件进行读操作时,如果数据未准备好、文件当前无数据可读,那么读操作可能会使调用者阻塞,直到有数据可读时才会被唤醒,这就是阻塞式I/O常见的一种表现;如果是非阻塞式I/O,即使没有数据可读,也不会被阻塞、而是会立马返回错误。普通文件的读写操作是不会阻塞的,不管读写多少个字节数据,re
2022-07-11 21:06:48
197
原创 利用EXCEL对数据进行比对,以及提取有效数据
对两列数据进行比对MATCH函数,在新建的列中输入如下函数:=MATCH(A1,C$1:C$148,)。其中A列为比对原始项,C列为给定的比对范围,返回的结果为numnum代表的意义是A中的项是在C中的第几项出现的比较的是AC列,在中间的B列中自动填充序号然后使用函数VLOOKUP进行查找在新建列中输入如下函数:=VLOOKUP(D1,B$1:C148,2,0)。就会在新建列中,按照B列中的对应值取提取在C列中对序号的值,填充到新建列中。涉及到两个方法——Excel中的两个函数对数据进行比
2022-07-11 10:38:02
3082
原创 JNI 导出头文件.h错误的解决方法
原本使用javah命令能正常生成头文件,但是在原来的工程将原来的工程java文件移动到了新新建的包下面,再次使用javah命令就出现了报错信息。大概错误就是找不到头文件一类的信息。1、没有在Java目录下执行javah命令首先要知道的是,com.jni是package如果工程路径为:E:\Project\TEST\trunk\JavadllDemo\src\com\jni\Test_JNI.class那么就要在E:\Project\TEST\trunk\JavadllDemo\src\下执行命令:ja
2022-07-11 09:05:01
412
原创 线程同步问题(四)
其初始化方式与互斥锁相同,譬如使用宏PTHREAD_RWLOCK_INITIALIZER进行初始化必须在定义读写锁时就对其进行初始化: pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;对于其它方式可以使用pthread_rwlock_init()函数对其进行初始化,当读写锁不再使用时,需要调用pthread_rwlock_destroy()函数将其销毁,其函数原型如下所示:参数rwlock指向需要进行初始化或销毁的读写锁对象。对于pthread_
2022-07-10 16:09:37
343
原创 线程同步问题(三)
自旋锁与互斥锁类似,从本质上说也是一把锁,在访问共享资源时,对自旋锁进行上锁,访问完成之后,释放自旋锁。从实现的方式上来看,互斥锁本质上是基于自旋锁来实现的,所以自旋锁更为底层。如果在获取自旋锁时,自旋锁处于未锁定状态,那么将立即获得锁(对自旋锁上锁);如果在获取自旋锁时,自旋锁已经处于锁定状态了,那么获取锁操作将会在原地“自旋”,直到该自旋锁的持有者释放了锁。,自旋锁与互斥锁相似,但是互斥锁在无法获取到锁时会让线程陷入阻塞等待状态;而自旋锁在无法获取到锁时,将会在原地“自旋”等待。“自旋”其实就是调用者
2022-07-10 15:55:19
877
原创 线程同步问题(二)
线程同步的第二种方法——条件变量条件变量是线程可用的另一种同步机制。条件变量用于自动阻塞线程,知道某个特定事件发生或某个条件满足为止,通常情况下,条件变量是和互斥锁一起搭配使用的。使用条件变量主要包括两个动作:解释一下:主线程在生产,新建的线程在消耗。代码开始运行之后,都处于死循环状态下。所以代码中没有使用互斥锁、等待回收新线程相关的代码。进程结束后会自动处理。但是需要注意的是,代码中会一直在循环检测g_avail是否大于0。浪费CPU资源,这是就可以采用条件变量来解决这个问题。条件变量允许一个线程进
2022-07-09 10:58:40
191
原创 TMS320LF2407编译及烧录,使用仿真器SEED-XDS510PLUS遇到的问题及解决方法记录
因公司项目需要,将老产品进行轻量升级改造,其中一款产品使用的是TI的DSP芯片,因为芯片型号老旧,开发的IDE工具的编译环境在搭建过程中出现了一系列问题,故此记录。系统:Windows11专业版,版本21H2因为使用的是DSP芯片,型号为——TMS320LF2407,所以查询了TI官网,https://www.ti.com.cn/,在对应的CCSTUDIO(Code Composer Studio)的开发环境下载页面,查询了早期版本的3.3版本的信息。其中需要有可能需要Login TI账户,然后登录下载
2022-07-07 17:07:36
3073
原创 线程同步问题(一)
对于单线程来说它不需要处理线程的同步问题,所以线程同步是在多线程环境下需要注意的问题。线程的主要优势在于资源的共享性。譬如通过全局变量来实现信息共享。但是这也会带来一个问题,多线程并发共享数据,会带来数据不一致的问题。这时候就需要使用线程同步来避免这个问题。1、线程同步是为了对共享的资源进行保护;共享资源指的是,多个线程都会进行访问的资源;2、保护的目的是为了解决数据的一致性问题;当一个线程修改的变量是其他线程可以读取或者修改的时候,就存在数据一致性问题。需要对这些线程进行同步操作,以确保他们在访问
2022-07-04 21:42:23
1280
原创 线程的学习,和线程的相关概念及多线程的学习指引
线程是参与系统调度的最小单位,包含在进程之中,是进程中实际运行的单位。一个进程可以创建多个线程,多个线程实现并发运行,每个线程执行不同的任务。比如当应用程序需要两个并发运行的任务Task1和Task2,可将两个不同的任务放置在两个线程中。当程序启动时,就有一个进程被操作系统创建,同时一个线程也立刻运行,该线程通常作为程序的主线程。任何一个进程都包含一个主线程,只有主线程的进程被称为单线程进程。多线程中除了主线程的部分,其他线程通常由主线程来创建,创建的新线程就是主线程的子线程。线程是程序运行的基本单位,进程
2022-06-29 21:47:59
525
原创 指针函数和函数指针
指针函数是一个带指针的函数,即本质上是一个函数,函数返回类型是某一类型的指针e.g. int* fun(x,y);首先他是一个函数,只不过有点特殊,返回值是一个地址,函数返回值必须用对应类型的指针变量来接收。具体使用如下所示:float* fun();float* p;p = fun()函数指针是指向函数的指针变量,本质上是一个指针变量e.g. int(*f)(int x); //声明一个函数指针f = func(a); //将func函数的首地址赋给指针f指向函数的指针,包含了函数的入口地
2022-06-24 13:15:05
111
原创 JNI之Linux生成动态库so说明文档
将VS生成DLL建立的工程中的inc和src文件夹拷贝到Linux开发环境下新建目录中。从Centos7中拷贝java中的jni_md.h替换DLL工程中的对应文件。Jni.h文件一般是不需要改动的。有必要的话,可以比较一下java-windows中的和java-Linux中这两个头文件的区别。在Linux下编译生成*.so动态库。要使用到相应的makefile,根据相应的编译命令来生成*.so动态库文件......
2022-06-24 10:20:40
205
原创 Visual Studio生成DLL(动态链接库文件)方法步骤
生成DLL文件,给java端调用,方式是通过java,JNI的方式来接入C语言封装的算法。这个链接是java-jni的使用背景,和接口文件过程https://blog.csdn.net/lwcloud/article/details/78326903根据VS不同版本按照对应的流程新建工程,VS2022中,按照如下方式进行:新建Windows桌面项目=>应用程序类型选择为动态链接库(.dll) => 其他项目选择空项目。至此新建DLL工程结束。需要JAVA侧提供三个头文件:“jni.h”,“jni_m
2022-06-24 10:12:03
2514
原创 arm-linux-gnueabihf交叉编译的一个例子,较详细
1、使能GPIO对应的时钟2、设置寄存器IOMUXC_SW_MUX_CTL_PAD_XX_XX,使其复用为 GPIO功能(配置复用)3、设置寄存器IOMUXC_SW_PAD_CTL_PAD_XX_XX,设置IO的上下拉,速度等(配置IO参数)4、配置GPIO,设置输入输出,是否使用中断,默认输出电平等根据原理图分析,需要对GPIO1_IO03做如下的配置:1、使能GPIO1时钟GPIO1的时钟由CCM_CCGR1的bit27和bit26两位控制,都设置为1即可。2、设置GPIO1_1O03的复
2022-06-20 21:29:26
1220
2
原创 ARM汇编基础,常见的汇编指令和语法结构
因为对于Cortex-A芯片来说,大部分的芯片在上电以后,C语言环境还没有准备完全,所以第一行程序都是汇编。需要多少行汇编程序,取决于C语言环境在第多少行汇编程序时准备好。C语言函数调用涉及到出栈入栈,需要对堆栈进行操作。所谓的堆栈其实就是一段内存,这段内存比较特殊,由SP指针访问,SP指针指向栈顶,当芯片上电的时候,SP还没有初始化,所以C语言没法运行,对于有些芯片还需要初始化DDR(芯片本身没有RAM,或者内部的RAM不给用户使用),需要在DDR中运行代码。需要用汇编初始化DDR控制器。编写的是ARM
2022-06-19 22:03:26
1184
原创 交叉编译器安装
交叉编译器是:1、首先他是一个GCC编译器2、这个GCC编译器是运行在X86架构的PC上面3、其次这个GCC编译器是用来编译ARM架构代码的,也就是编译出来的可执行文件是在ARM芯片上运行的。交叉编译器有很多种,可以使用Linaro出品的交叉编译器,编译器的下载地址如下:https://releases.linaro.org/components/toolchain/到Linux系统上新建一个文件夹目录在 Ubuntu中创建目录:/usr/local/arm然后将下载的交叉编译器复制到这个目录
2022-06-19 16:46:35
905
原创 Ubuntu和Windows文件互传
打开Ubuntu的终端,然后执行如下命令来安装FTP服务安装完成后,VI打开命令,打开 命令打开 /etc/vsftpd.conf打开 vsftpd.conf文件以后找到如下两行:确保这两行前面没有#(没有被注释掉),有的话就取消掉。修改完成之后,重启FTP服务2、使用FTP工具连接到FTP服务器登录时要注意修改文件编码方式强制为UTF-8,不然连接FTP服务显示的Ubuntu下面的文件名字会显示为乱码(NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同
2022-06-19 16:15:50
666
原创 Makefile的规则和写法常见使用说明
规则格式如下:目标 …… : 依赖文件集合 ……命令 1命令 2……比如下面这样常见的规则:这条规则的目标是main,main.o,input.o,和calcu.o是生成main的依赖文件!!!命令列表中的没调命令必须以TAB键开始,不能使用空格!!!make命令会为Makefile中的每个以TAB开始的命令创建一个shell进程去执行。分析一个Makefile,举例如下:上述代码中一共有5条规则,12行为一条规则,以此类推;make 命令在执行这个Makefile的时候,其执行步骤如下
2022-06-18 22:15:12
419
原创 格式化I/O常见知识,标准化输入输出库函数
在前面的编写的测试代码中,会经常使用到库函数,printf()用于输出程序中的打印信息,printf()函数可将格式化数据写入到标准输出,所以通常称为格式化输出。除了printf()之外,格式化输出还包括:fprintf()、dprintf()、sprintf()、snprintf()这4个库函数。与之对应的格式化输入包括scanf()、fscanf()、sscanf()这三个库函数。C库函数提供了5个格式化输出函数,包括:printf()、fprintf()、dprintf()、sprintf()、snp
2022-06-18 20:47:59
870
原创 文件I/O的深入学习
文件存储在硬盘上,硬盘的最小的存储单位叫做扇区(Sector),每个扇区存储的是512字节(0.5KB),操作系统读取硬盘的时候,不是按照一个扇区一个扇区的去读,而是一次性的取一个块,这种扇区组成的块,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成一个block。所以由此可以知道,静态文件对应的数据都是存储在磁盘设备不同的块中。那么open函数是如何找到对应的文件的数据存储块的?磁盘在进行分区和格式化的时候,会分为两个区域,一个是数据区,主要用于存储文件中的数据。另一个
2022-06-18 12:11:54
80
原创 Linux文件系统
ext2文件系统:ext2是 Linux早期的文件系统,但是随着技术发展ext2文件系统已经不推荐使用了。是一个非日志文件系统。ext3文件系统:是一个日志文件系统,在ext2的基础上发展起来的文件系统,完全兼容ext2。ext4文件系统:是在ext3的基础上发展起来,相对于ext3相比提供了更佳的性能和可靠性并且功能丰富,向下兼容ext3、ext2。在 Linux下因为没有 C、D盘之说。Linux只有一个根目录1、创建新文件命令——touch2、文件夹创建命令——mkdir3、文件及目录
2022-06-16 20:26:35
230
原创 文件IO操作
1、文件描述符调用open函数会有一个返回值,是一个int类型的数据,在open函数执行成功的情况下,会返回一个非负的整数,该返回值就是一个文件描述符(file descripor)。对于Linux内核来说,所有打开的文件都会通过文件描述符进行索引。当调用open打开一个现有文件或者创建一个新文件时,内核都会向进程返回一个文件描述符,用于指向被打开的文件。当调用open、write函数进行文件读写时,会将文件描述符传给read、write函数。在Linux系统中要操作一个文件,需要先打开该文件,得到文件
2022-06-16 19:59:59
330
原创 Linux应用编程记录(一)
系统调用(system call)其实是Linux内核提供给应用层的应用编程接口(API),是Linux应用层进入内核的入口。不止Linux系统,所有的操作系统都会向应用层提供系统调用,应用程序通过系统调用来使用操作系统提供的各种服务。系统调用(system call)其实是Linux内核提供给应用层的应用编程接口(API),是Linux应用层进入内核的入口。不止Linux系统,所有的操作系统都会向应用层提供系统调用,应用程序通过系统调用来使用操作系统提供的各种服务。通过系统调用API,应用层可以实现与
2022-06-15 19:57:23
375
原创 C语言数组及数组指针
1、数组首元素地址和数组地址是两个不同的概念:2、数组名代表数组首元素的地址,是一个常量。(变量从本质上来说,是内存空间的别名,定义数组,就会自动分配内存,内存就会固定下去,所以数组的名在创建之后就不能更改)3、数组首元素的地址和数组的地址相等对一维数组 C语言规定的就是这样的。一、定义数组类型二、数组指针类型数组指针用于指向一个数组2、数组指针用一个指针指向一个数组:方法一:声明一个数组类型,用数组类型来定义一个指针变量,通过指针变量(二级指针)来访问一维数组。方法二:声明一个数组
2022-06-11 10:35:12
320
原创 关于main函数的格式,main(int argc,char *argv[])与main(void)
int main(int argc,char *argv[]) 是UNIX和Linux中的标准写法;int main()只是UNIX及Linux默许的用法。总结argc:命令行总的参数的个数,即argv中元素的格式;argv[ ]:字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参;argv[0]:指向程序的全路径名;argv[1]:指向在shell命令中执行程序名后的第一个字符串;argv[2]:指向第二个字符串。运行程序的时候要对应运行在命令行输入运行代码例如:./m
2022-06-08 10:20:36
538
原创 C语言文件操作
文章目录文件操作一、文件的打开与关闭二、使用步骤1.引入库2.读入数据总结文件操作C语言的文件操作相关内容一、文件的打开与关闭1.文件型指针变量 FILE *fp;其中fp是一个指向FILE类型结构体的指针变量,结构的具体定义为typedef struct _iobuf{ void* _Placeholder;} FILE;一般来说,可以通过fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。当有多个文件的时候,可以设置多个指针变量,分别指向到各个文
2022-05-31 22:58:55
600
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人