- 博客(17)
- 收藏
- 关注
原创 XIAO ESP32S3 Sense语音唤醒和命令词识别
本文基于XIAO ESP32S3 Sense实现语音唤醒和命令词识别,方法主要分为seeed官网提供Edge Impulse教程和乐鑫提供ESP-Skainet。
2024-04-01 09:06:03 2140 2
原创 vscode中Arduino cli 编译项目时:No such file or directory
使用Arduino IDE编译时没有问题,使用Vscode编译时出现 fatal error:XXXXXX.h: No such file or directory`
2024-03-28 13:39:16 921 1
原创 linux学习笔记_10.UDP网络编程
注意后两个参数是输出参数,其中addrlen既是输入又是输出参数,即值-结果参数,需要在调用时,指明src_addr的长度。另外,如果不关心数据发送端的地址,可以将后两者均设置为NULL。src_addr/dest_addr:发送/接受数据的客户端地址信息的结构体。flags:需不需要阻塞,默认填0。sockfd:接收的socket。addrlen:指向结构体长度值。buf:接收/发送的数据放在哪。len:接收/发送多大的数据。
2022-10-08 19:55:36 204 1
原创 linux学习笔记_9.TCP高级应用
应用程序对驱动文件在进行IO操作的时候,一般分为阻塞和非阻塞两种模式,针对阻塞IO模式来说,如果APP不能操作对应的文件,那么对文件的访问进程就会被挂起来,一直等到可以获取到设备资源后才能执行。异步I/O是进程执行I/O系统调用(读或写)告知内核启动某个I/O操作,内核启动I/O操作后立刻返回到进程,进程在I/O操作发生期间继续执行,当操作完成或遭遇错误时,内核以进程在I/O系统调用中指定的某种方式通知进程,所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。
2022-10-08 19:54:37 582
原创 linux学习笔记_8.Socket网络编程
在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议,而不需要让用户自己去定义什么时候需要指定哪个协议哪个函数。当套接字正在处理客户端请求时,如果有新的请求进来,套接字是没法处理的,只能把它放进缓冲区,待当前请求处理完毕后,再从缓冲区中读取出来处理。如果将 backlog 的值设置为 SOMAXCONN,就由系统来决定请求队列长度,这个值一般比较大,可能是几百,或者更多。
2022-10-08 19:52:34 232
原创 linux学习笔记_7.多线程
一个 线程如果对一个已经加锁的普通锁再次加锁,将引发死锁;互斥锁本质就是一个特殊的全局变量,拥有lock和unlock两种状态,unlock的互斥锁可以由某个线程获得,当互斥锁由某个线程持有后,这个互斥锁会锁上变成lock状态,此后只有该线程有权力打开该锁,其他想要获得该互斥锁的线程都会阻塞,直到互斥锁被解锁。默认锁(PTHREAD_MUTEX_ DEFAULT):一个线程如果对一个已经加锁的默认锁再次加锁,或者虽一个已经被其他线程加锁的默 认锁解锁,或者对一个解锁的默认锁解锁,将导致不可预期的后果;
2022-10-08 19:51:10 289
原创 linux学习笔记_6.System V进程间通信
有一个key值唯一标识这个IPC对象,进程间通过这个大家都知道的一样的key来进行获取对应的IPC对象,从而进行通信,这个key可以人为直接指定,但需要确保唯一性,不能与已存在的不一样作用的重复,为此可以使用**ftok()**函数按照相关条件生成,只有双方条件一致key才相同,这样key一样的也就正好对应需要通信的双方。SEM_STAT:同 IPC_STAT,但 shmid 为该 SEM 在内核中记录所有 SEM 信息的数组的下标,因此通过迭代所有的下标可 以获得系统中所有 SEM 的相关信息。
2022-10-04 19:36:31 344
原创 linux学习笔记_5.异步信号处理机制
注意,只有当一个信号递达且处理方式被捕捉时,pause函数引起挂起操作的进程才会被唤醒,而且只有当信号处理完后(调用完用户处理函数),pause函数才返回-1,且errno置EINTR,进程被唤醒继续执行后面的程序。未决信号集不需要程序猿修改, 如果设置了某个信号阻塞, 当这个信号产生之后, 内核会将这个信号的未决状态记录到未决信号集中,当阻塞的信号被解除阻塞, 未决信号集中的信号随之被处理, 内核再次修改未决信号集将该信号的状态修改为递达状态(标志位置0)。进程的信号掩码被设为由sigmask所指的值。
2022-10-04 19:34:59 1552
原创 linux学习笔记_4.进程管理
僵尸进程虽然不占有任何内存空间,但如果父进程不调用 wait() / waitpid() 的话,那么保留的信息就不会释放,其进程号就会一直被占用,而系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,即回收了用户资源但内核空间的PCB还没有释放,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。
2022-10-04 19:33:34 400
原创 linux学习笔记_3.文件管理
buffer – 这是分配给用户的缓冲,它的长度至少为 BUFSIZ 字节,BUFSIZ 是一个宏常量,表示数组的长度。系统默认为每个进程打开三个文件,标准输入流(/dev/stdin),标准输出流(/dev/stdout),标准错误输出流(/dev/stderr)。设置了setuid位,在普通用户执行passwd操作时,他对/etc/passwd文件的操作上升至root用户权限,即可进行修改操作。如果一个文件的setuid被设置,则该文件被执行时,进程的有效用户ID(EUID)被设置成该文件的所有者。
2022-09-26 10:09:18 334 1
原创 linux学习笔记_2.进程存储管理
操作系统会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都是专门的指令运行.堆则是C函数库提供的,它的机制非常复杂。堆的效率比栈要低的多.栈是向低地址扩展,是一块连续的内存区域.即栈顶的地址和栈的最大容量是系统预先规定好的,当申请的空间超过栈的剩余空间时,将出现栈溢出错误.堆是向高地址扩展,是不连续的内存区域.由于系统是用链表来存储空暇内存地址的。栈的分配和释放是由操作系统完毕的,栈的动态分配有alloca()函数完毕,可是栈的动态分配和堆是不同的,其由编译器进行分配和释放,无须手工完毕.
2022-09-26 10:04:26 636
原创 linux学习笔记_1.系统简介
嵌入式Linux的四个要素:•Toolchain: 为目标设备创建代码所需的编译器和其他工具。•Bootloader: 初始化主板并加载Linux内核的程序•Kernel: 这是系统的核心,管理系统资源与硬件接口•Root filesystem:包含内核完成初始化后运行的库和程序。Debian是Linux发行版,Ubuntu是Debian的二次开发版本CPU架构:ARM:精简指令集(RISC)X86: 复杂指令集(CISC)GNU:Linux仅仅是所用系统的一部分。
2022-09-26 09:59:55 451
原创 Fabric_sdk_go:QueryBlockConfig failed: QueryBlockConfig failed: target(s) required
Fabric_sdk_go:(已解决)event service creation failed: could not get chConfig cache reference: QueryBlockConfig failed: QueryBlockConfig failed: target(s) required错误日志:配置文件config_test:channel名称为mychannel,demo里是orgchannel。[解决方法]config_test里注释orgchannel: #
2021-10-05 17:22:12 13412 4
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人