- 博客(30)
- 收藏
- 关注
原创 C++STL的学习与使用
*vector 生成*///0 0 0//5 5 5//1 2 3/*vector 头尾*///第一个元素vct.back();//最后一个元素/*vector 迭代器*/vector<int>::iterator iter //一个vector的迭代器vct.begin() //指向vct第一个元素位置的迭代器vct.end() //指向vct最后一个元素后一个位置的迭代器/*vector 插入*///在尾部插入一个2//在指定位置前面插入一个元素/*vector 删除*/
2025-03-12 15:49:19
766
原创 关于AI快速发展对程序员带来的冲击的思考
背景:对于一些具体的工作需求,可以完全让AI生成后再修改融合进自己的代码中。通过AI的使用,可以极大的缩小不同员工之间的代码水平,也进一步缩小大小公司之间的代码水平差异。人人都可以运用AI写出远超自己能力的代码。那么AI能够写出更高效更优秀的代码,我们应该顺应AI的发展做出哪些改变?
2025-02-26 14:44:18
230
原创 关于头文件为什么要加条件编译语句
上述代码从main.c开始,要包含addTwoNumbers的声明,因此要包含common_function.h的头文件,但是为了保证后续开发,一般main可能会包含多个函数声明,因此在这里先包含了main_logic.h头文件,然后main_logic.h又包含了两个头文件,其中common_function.h是我们需要的,到这里其实就完成了。内容和上述例子差不多,只是多加了条件编译和宏定义,在没有定义的时候进行定义。因为有些情况重复包含头文件会出现重复定义或者导致多次包含导致增加编译时间。
2024-10-10 17:18:59
192
原创 gcc命令记忆
o 代表 output,即输出可执行文件。如果不指定输出文件,则默认生成a.out-E 可以理解为expand即展开,展开即可联想为预处理,因为预处理的操作就是展开头文件,宏定义等。.i 预处理处理后的文件,i可以理解为 “intermediate”(中间的),预处理后生成中间文件。编译就是生成汇编,将代码转化为汇编语言。-S 可以理解为Assembly 即编译,.s后缀也一样。
2024-10-10 14:28:44
349
原创 FreeRTOS学习总结
事实上,FreeRTOS有一个空闲任务Idle task,当没有任务执行时,就会运行这个任务,同时,对于释放内存的行为,也是在Idle任务里进行的,因此如果不加以暂停让Idle运行的话,如果一直创建任务且不释放任务,内存最后会耗尽。优先级高的先读,同等优先级的等得更久的先读,确实是一种很合理的方式。就绪态就是已经准备好的任务,处于这个状态的任务只要一切换到它就可以运行,比如说有个低级任务也不用等待什么信号才能运行,就只需要高优先级的任务执行完切换到它就可以运行了,那么这个任务就是处于就绪态的。
2024-10-09 11:20:21
841
原创 关于在vscode上运行lvgl程序
模拟器可以在计算机环境(如 Windows、Linux、macOS 等)中模拟出一个类似于嵌入式设备的显示环境,这样开发者可以在没有硬件设备的情况下进行 LVGL 相关代码的开发、调试和测试工作。lvgl是图形库,在开发阶段,如果没有嵌入式硬件支持,可以用电脑的硬件进行支持显示,这个时候就要进行模拟器的配置,让其能够在电脑上运行,显示,调试。vscode本身只是一个编辑器,如果想要编译调试,就需要下载编译器,在windows上可以下载mingw64编译器,然后配置环境变量。文章中的SDL2是什么?
2024-09-19 15:10:00
1980
原创 pro git 学习及git使用
8、可以通过git tag命令来查看标签,创建标签git tag -a v1.0 -m “版本号”,这个标签默认会打在最近的一次提交上,如果需要打在指定的提交上可以使用git tag -a v1.2 commitid,删除tag使用git tag -d name,标签不会在推送的时候直接共享,可以使用git push origin tagname,删除远程标签git push origin --delete tagname。加入了一个感叹号后,再使用git diff,发现差别只有!
2024-09-12 16:17:55
859
原创 git 基础使用教程
背景:对于频繁复制粘贴文件,来保证原版本,使用版本管理不仅可以远远降低内存的占用,还可以详细地跟踪文件发生了哪些变化。对于已有的git教程,要么是过于基础而不够实用,要么是过于复杂直接对新人造成劝退,在学习过程中,总结了以下内容。只需熟悉以下指令,便能够实现最基本的团队合作,以及对自己的本地仓库与远程仓库进行跟踪。
2024-09-12 16:15:46
998
原创 vim常用命令
1. 使用 `Ctrl + N` 触发自动补全后,继续按下 `Ctrl + N` 可以在不同的补全选项之间切换,当想要的补全内容显示时,按下 `Ctrl + X Ctrl + L`(大写字母 L)可以展开整行补全内容并选中该行。2. 如果是单个单词的补全,可以使用 `Ctrl + P` 和 `Ctrl + N` 切换到想要的补全内容后,按下 `Ctrl + X Ctrl + W`(大写字母 W),可以选中补全的单词。使用ctrl+v进行块选中,然后使用I进行插入,插入后按esc退出,即可。
2024-09-10 11:52:16
407
原创 指令和代码的理解
例如,对于刚才例子中的加法操作,一种指令集可能规定操作数直接在指令中给出,如 “000110100101”,而另一种指令集可能是 “000100010010”,其中 “0001” 是加法操作码,“0010” 是一个寄存器编号,实际的操作数存储在这个寄存器中。因此在不同的CPU平台需要不同的编译器进行编译,以生成对应平台可以识别的二进制指令,同时系统是在CPU层级上的,无论是运行在X86上的windows系统还是Linux系统,要想产生运行在ARM上的可执行程序,都需要进行交叉编译。
2024-09-09 09:54:18
1203
原创 关于git push和pull的使用
当使用git push -u origin main时,表示将本地的main分支的内容发送到远程仓库,如果远程仓库的默认分支名和你的本地分支名不同,Git 会创建一个新的分支。默认情况使用clone下载的内容是默认分支下的文件,如果想要下载另一个分支下的内容,可以使用 -b main 来表示下载main分支下的文件。
2024-08-23 15:27:42
267
原创 gitignore的使用
该文件可以将不想跟踪的文件做不显示处理,对于前期已经跟踪,后续因为编译频频出现修改,且不需要上传的文件,则可以使用git rm --cached *.d *.o类似的语法将已跟踪的文件取消跟踪,然后再将“这个操作产生的修改”提交为版本。可以自己在根目录,即.git的同一文件下创建.gitignore文件,也可以通过在vscode使用插件gitignore,将未跟踪的文件逐个加入到.gitignore文件中,在加入时,会自行创建文件。对于gitignore文件的语法,
2024-08-23 14:40:17
213
原创 C++宽字符
在实际的程序中,宽字符常量和类型通常用于处理多语言和国际化的文本数据。宽字符是指在编程中使用的一种字符类型,通常用于表示非ASCII字符或Unicode字符。处理多语言文本:当需要处理包含非ASCII字符的多语言文本时,例如中文、日文、俄文等,宽字符常常是必需的。这些字符可能需要使用Unicode编码表示,而Unicode字符通常需要用多个字节来存储,因此需要使用宽字符类型来处理。当需要处理非ASCII字符、Unicode字符、多语言文本或特殊符号时,通常需要使用宽字符类型。
2024-01-17 17:22:27
865
原创 Linux互斥锁与读写锁
在Linux系统中,可以使用pthread库中的pthread_mutex_t类型来创建和操作互斥锁。下面是一个详细的教程,介绍如何在Linux系统中使用线程互斥锁和读写锁。在Linux系统中,可以使用pthread库中的pthread_rwlock_t类型来创建和操作读写锁。当使用互斥锁时,需要确保在访问共享资源之前先锁定互斥锁,在访问完毕后再解锁互斥锁。函数中,我们创建了一个读取共享资源的线程和一个写入共享资源的线程,并在最后销毁了读写锁。在上面的例程中,我们首先初始化了一个互斥锁,并在。
2023-12-29 16:25:29
563
2
原创 SQlite3学习笔记
函数是SQLite数据库API中的一个重要函数,用于准备SQL语句以供后续执行。它的作用是将SQL语句编译成一个可执行的SQL语句对象,该对象可以被后续的SQLite API函数使用。在编译过程中,SQLite会对SQL语句进行语法分析、语义分析和查询优化,并将其转换为一个字节码程序,以便后续的执行。函数来准备SQL语句,并使用后续的SQLite API函数执行和处理查询结果。这个函数的作用是非常重要的,它可以帮助我们安全地执行SQL语句,并且可以提高执行效率。语句,该语句将所有用户的ID和姓名查询出来。
2023-12-29 11:32:06
691
1
原创 嵌入式执行程序的过程
CPU通过读取flash存储器中的程序内容,并将其复制到内存中,然后设置程序执行环境并转移控制权,来实现将程序从flash加载到内存并执行的操作。2. 复制程序到内存:CPU根据程序入口地址,从flash存储器中读取程序的指令和数据,并将它们复制到内存中的指定位置。1. CPU:程序首先被加载到内存中,然后CPU通过指令集对程序进行解析和执行。4. 转移控制权:一旦程序被复制到内存中并且执行环境设置完成,CPU会将程序计数器设置为程序入口地址,从而转移控制权到程序的起始位置,开始执行程序。
2023-12-25 09:04:42
668
原创 关于stm32点灯不用配置时钟源的问题
在对STM32C8T6进行LED灯开启时,只需要对GPIO口的外设时钟进行使能,而不需要对时钟源进行使能的原因是因为GPIO口的时钟源通常在复位后就已经默认使能了。在STM32微控制器中,GPIO口通常使用的是主时钟(HCLK)作为时钟源,而主时钟在复位后会自动使能,因此不需要额外的操作来使能主时钟。通过配置时钟控制寄存器,可以选择所需的时钟源,并对其进行使能。总之,对GPIO口的外设时钟进行使能是确保GPIO口正常工作的必要步骤,而不需要额外对时钟源进行使能,因为主时钟通常在复位后就已经默认使能了。
2023-12-13 10:57:34
687
1
原创 stm32远程升级
在实际的远程升级过程中,为了确保原有的程序可以被恢复,通常会采用一种称为“安全启动”(Safe Boot)的机制。在进行远程升级时,新程序代码会首先被写入备份程序存储区域,然后在验证新程序代码无误后,通过特定的机制将新程序代码复制到主程序存储区域。如果在复制过程中发生错误,微控制器可以通过特定的启动模式或引导方式,回滚到备份程序存储区域,并继续运行原有的程序。因此,在进行远程升级时,确保微控制器具有安全启动机制是非常重要的,这可以保证即使升级过程中发生错误,原有的程序代码仍然可以被恢复并继续运行。
2023-12-11 16:23:19
458
1
原创 valgrind错误解析与排查
4. **使用调试器**:结合Valgrind的输出信息,可以使用调试器(如GDB)来在出错的位置设置断点,并逐步执行代码,观察变量的值和内存访问情况,以便更清晰地理解问题所在。7. 最后,Valgrind提供了一些错误汇总信息,建议使用`--track-origins=yes`选项来查看未初始化值的来源,也提供了重新运行Valgrind的选项。总的来说,Valgrind的输出结果指出了程序中的内存错误,包括未初始化值的使用和无效的内存读取,帮助开发人员找出并修复这些问题。
2023-12-05 15:46:23
811
原创 shell和终端的关系
终端(Terminal)是指用户与计算机进行交互的设备或程序。在图形界面环境下,终端通常是一个模拟器,用于模拟字符终端的功能。用户可以通过终端输入命令,然后终端会将命令传递给shell进行解释和执行。终端还负责显示shell输出的结果。Shell是一种命令行解释器,用于解释和执行用户输入的命令。它是用户与操作系统内核之间的接口,负责接收用户输入的命令并将其转化为操作系统能够理解的指令。而终端是用户与计算机进行交互的设备或程序,用于输入命令和显示结果。Linux的shell和终端是两个不同的概念。
2023-10-26 15:16:06
527
原创 Ubuntu链接多个文件
假设我们有两个源文件main.c和func.c,以及一个头文件func.h。我们想要将这两个源文件编译链接成一个可执行文件main。如果编译链接成功,将生成可执行文件main。3. 输入make命令,执行Makefile文件中的编译链接规则和指令。1. 创建一个Makefile文件,该文件包含编译链接的规则和指令。文件包括:main.c fun.c fun.h。4. 如果编译链接成功,将生成可执行文件。这将删除所有生成的目标文件和可执行文件。2. 打开终端,进入代码所在的目录。
2023-10-26 14:26:36
111
原创 枚举和结构体实现C语言面向对象编程
在上述代码中,我们使用了枚举类型 `AnimalType` 来表示不同的动物类型,结构体 `Animal` 表示动物对象,其中包含了类型、名字和年龄等属性。然后,我们定义了一个 `Animal_SayHello` 方法,根据动物对象的类型输出不同的问候语。在 `main` 函数中,我们创建了几个不同类型的动物对象,并调用了 `Animal_SayHello` 方法来展示不同动物的问候语。这个例子展示了如何使用枚举和结构体来实现面向对象的编程思想,通过将数据和方法封装在结构体中,并通过指针传递来调用方法。
2023-10-25 11:20:56
65
1
原创 51单片机的定时器中断
接着编写了Timer0_ISR()函数作为定时器0的中断服务程序,在该函数中重新设置定时器的初值,并将LED引脚取反,实现LED灯的亮灭。总结:定时器和中断是单片机中常用的功能模块,通过合理的使用定时器和中断,可以实现定时功能和响应外部事件的需求。4. 主程序中使用定时器和中断:根据需要,在主程序中设置定时器的启动和停止条件,并处理定时器中断的相关操作。4. 主程序中使用定时器和中断:启动定时器,等待定时器中断触发,执行中断服务程序中的函数。- 定时模式:定时器按照设定的时间间隔进行定时,并触发定时中断。
2023-10-16 14:12:06
1592
1
原创 LCD1602显示预设字符和自定义字符
在上面的代码示例中,我们通过调用lcd_send_cmd(LCD_CMD_SET_CGRAM_ADDR)将CGRAM的地址设置为写入模式,然后通过循环将自定义字符的像素数据写入CGRAM。当我们调用lcd_send_data(65)时,实际上是将ASCII码为65的字符'A'的对应编码(即CGROM中的地址)发送给LCD1602。对于自定义字符,LCD1602的内部控制器并不会直接从CGRAM中读取字符的像素点阵。因此,预设字符的显示是由LCD1602的内部控制器完成的,而不是由我们的代码直接控制的。
2023-10-16 13:42:50
294
1
原创 LCD1602
当数据口的引脚电平为高电平时,表示逻辑上的1,而当引脚电平为低电平时,表示逻辑上的0。在液晶模块中,高电平和低电平有不同的含义,比如高电平表示液晶模块正在执行指令或者处于忙状态,而低电平表示液晶模块处于空闲状态。这段话的意思是将LCD1602的数据口LCD1602_DB的值设置为0xFF,即将数据口的8个引脚的电平都设置为高电平。因此,在读取状态字之前,我们需要将数据口的引脚电平都设置为高电平,以确保读取到的状态字是准确的。在读取状态字之前,我们需要确保数据口处于高电平状态,以避免读取到错误的状态字。
2023-10-15 21:46:50
151
1
转载 马原学习笔记
层级不同是指 浅程度(层次)和深程度(层级) 比如:感觉动物都有,而思维是人脑的活动,只有人才有。感性认识通过感觉器官获得,理性认识形成的关键是大脑思维。2、含义不同 意识是 客观事物在人脑中的反映(含主动形成和被动接受)4、对应的概念不同 意识与物质对应 认识与实践对应。1、体系不同 意识属于唯物论 认识属于认识论。认识是 人脑对客观事物的反映(主动形成)3、层级不同 意识包括 感觉和思维。认识包括 感性认识和理性认识。......
2022-08-16 21:19:04
375
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人