- 博客(26)
- 收藏
- 关注
原创 存储器与寄存器
Flash存储器是一种可以电可擦除并可编程的存储器,数据在断电后仍然保存。它通常用于各种电子设备,如手机、相机、USB闪存驱动器和固态硬盘(SSD)。
2024-11-02 21:48:25
817
原创 --no-multibyte-chars解决Keil中文字符编码报错
新版MDK无法支持单中文字符如:const char *p = "你";新版本Keil在使用字库时,编译出现以下报错:提示是什么缺少了一个逗号,把编码改成GBK ANSI UTF-8都一样报错。但是改为成对就不报错了,如:const char *p = "你好";经过多次实验发现:只要是中文字符在MDK新版本中:奇数中文字符会出现以上报错,偶数中文字符则不会报错。
2024-10-26 17:18:23
488
3
原创 STM32
STM32是意法半导体(STMicroelectronics)推出的一系列基于ARM Cortex-M内核的微控制器。该系列微控制器以其高性能、低功耗和丰富的外设选项而广泛应用于各种嵌入式系统。
2024-10-24 10:41:13
1822
原创 STM32F103C8T6 IO 操作
查找要开启时钟的寄存器,然后通过该寄存器操作时钟的开启或关闭。比如要打开IOPA的时钟就要操作该寄存器的第二位IOPAEN为1,就需要知道RCC_APB2ENR这个寄存器的地址。在 STM32 微控制器中,开启 GPIO 端口的时钟是确保 IO 口可以正常工作的第一步。RCC的基地址是0x4002 1000,APB2ENR的偏移量是0x18,所以。RCC的基地址加上这个寄存器的偏移地址就是这个寄存器的实际地址。找到GPIOx的基地址,再根据偏移地址找到要使用的寄存器的地址。这样就开启了GPIOA的时钟。
2024-10-23 23:05:28
832
原创 keil工程创建(STM32F103C8T6为例)
首先查看下载的Keil版本,新的Keil ARM用的是 Compiler version 6,与前面的版本不兼容,要么下载旧版本,要么替换ARM编译器为旧版本的Compiler version 5。可以去ST官网下载官方提供的外设标准库,里面有提供标准的启动文件,然后拷贝必要的启动文件。如果要添加头文件等其他文件的话可以选择文件类型为ALL,默认不用添加,因为后面还要设置,头文件路径才能找到头文件。删除默认的工程文件,新建自己的工程文件为了好与刚刚创建的文件目录相对应。解压之后,把解压的后文件夹放入到。
2024-10-23 21:16:47
878
原创 可变参数列表详解
使用+3是为了确保向上调整到下一个 4 的倍数。使用& ~3是为了清除最低两位,保证结果是 4 的倍数。计算当前大小sizeof(n)计算数据的大小。增加对齐值是为了确保即使当前大小不是 4 的倍数,也能向上调整。位运算创建一个掩码,用于清除低位。将上述两者相与,得到符合 4 字节对齐的值。假设n是一个char类型的参数,其sizeof(n)1 + 4 - 14~(4 - 1)~3(在 32 位系统上)4 & ~34最终结果是 4,这意味着下一个参数的地址将根据 4 字节对齐来计算。
2024-10-13 15:22:40
1033
原创 遗忘linux的root密码,怎么修改?
1.重启Linux系统,在开机界面出现时按进入编辑模式。2.找到以ro开头的字母,删除ro及后面同行的指令,然后在这个位置添加指令然后按就会进入到RAM Disk的环境。是 Linux 系统引导参数,用于在引导过程中挂载根文件系统为可读写模式(read-write),并在加载初始 RAM 磁盘(initramfs)阶段中断引导。这个参数通常用于临时修改系统配置或修复引导问题。rw:表示将根文件系统以可读写(read-write)模式挂载。这允许对根文件系统进行写操作,而不仅仅是只读操作。
2024-09-03 11:05:28
1911
2
原创 c++(更新中~)
/ 定义命名空间// 在命名空间中定义变量、函数、类等int x;// 变量声明// 函数声明// 类声明// 在命名空间外定义函数的实现// 函数实现。
2024-08-29 23:21:33
1212
原创 Linux(更新中~)
在Linux系统中,文件名以点(.)开头通常具有特殊的含义,这种文件通常被称为“隐藏文件”。隐藏文件在Linux系统中不会在普通的文件浏览器中显示,除非用户显式地设置文件浏览器显示隐藏文件。这种设计有助于隐藏系统和配置文件,以及其他用户可能不需要直接操作的文件,从而保持文件系统的整洁性和安全性。:文件管理器默认不显示以点开头的文件,这些文件对于用户来说是隐藏的。:许多以点开头的文件是用来存储应用程序或系统的配置信息,如.bashrc.gitignore等。:有时以点开头的文件用于存储临时数据,例如。
2024-08-29 21:18:18
2448
原创 排序---
排序是对数据、元素或对象按照一定的规则或条件进行排列的操作。排序通常是根据一些特定的标准将项目从小到大或从大到小重新排列。在编程中,根据具体情况选择合适的排序算法是很重要的。每种排序算法都有其优势和局限性,比如在特定情况下可能会有更高的效率。
2024-08-29 14:55:15
1000
原创 二叉树--
二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树常用于实现二叉搜索树、堆等数据结构,具有广泛的应用。
2024-08-26 10:50:48
749
原创 栈和队列-
栈(Stack)是一种常见的数据结构,遵循后进先出(LIFO,Last In First Out)的原则。这意味着最后进入栈的元素将被最先移除。栈可以比喻为一叠盘子,你只能在顶部放置或移除盘子。
2024-08-26 10:09:27
922
原创 Linux常用命令
是一个用于设置用户文件创建权限掩码的命令。在 UNIX 和类 UNIX 操作系统中, 值定义了在创建新文件或目录时要屏蔽的权限位。具体来说, 值会从新创建的文件或目录权限中去除相应位的权限。查看当前的 值: 设置 值: 每一位代表一个权限位,一般来说,第一位控制所有者的权限,第二位控制与所有者同一组的用户的权限,第三位控制其他用户的权限。 umask -S 显示创建的默认权限 若是非执行程序会默认去掉可执行权限 r-可读 ;w-可写;x-可执
2024-08-14 14:49:38
914
原创 顺序表和链表
线性表是一种常见的数据结构,用于存储一组按照顺序排列的元素。线性表中的元素之间存在一对一的关系,即每个元素都有唯一的前驱和后继元素(除了第一个元素和最后一个元素)。常见的线性表:顺序表、链表、栈、队列、字符串等,线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。
2024-08-14 10:27:05
261
原创 算法的时间复杂度和空间复杂度
算法在运行时需要耗费的时间资源和空间(内存)资源。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。
2024-08-07 15:41:16
340
原创 C语言细枝末节
结构体,联合体,枚举这些复合类型在定义时并不直接占用空间,而是在使用时分配空间。它们的大小取决于内部成员的大小和对齐方式,以及编译器的实现。通常在实例化这些类型的变量时才会占用实际的内存空间。
2024-08-06 17:41:40
2125
原创 C预处理,宏,条件编译详解
预定义符号(Predefined Symbols)通常指在编程语言或编程环境中预先定义好的符号或标识符,在程序中可以直接使用而无需额外定义。这些符号具有特定的含义和功能,通常用于简化编程过程、提供便利或实现特定的功能。int main()printf("当前文件名:%s\n", __FILE__);//__FILE__:当前源文件的文件名,以字符串形式表示。printf("当前行号:%d\n", __LINE__);//__LINE__:当前源文件中的行号,以整数形式表示。
2024-08-04 14:24:16
968
原创 C文件操作
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。每当打开一个文件时,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,通过FILE的指针来维护这个FILE结构的变量。因为有缓冲区的存在,在操作文件的,需要刷新缓冲区或在文件操作结束时关闭文件,关闭文件不仅会释放文件资源,还会触发缓冲区的刷新,确保所有数据被写入文件。整数1以ASCII码的形式输出到磁盘,则磁盘中只占1个字节,以二进制形式输出,在磁盘上要占4个字节。
2024-08-02 22:21:49
961
原创 动态内存管理
用于分配指定数量和大小的内存块,并将内存初始化为零。它接受两个参数,分别是之前分配的内存块指针和新的大小,并返回一个指向重新分配内存的指针。需要在内存中寻找一个新的适当大小的内存块,将原始内存块的内容复制到这个新的内存块中,然后释放原始内存块,返回新内存块的地址。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。:如果之前分配的内存块后面没有足够的空间以容纳扩展后的内存块,或者由于其他原因无法直接在原始内存块上扩展,则。
2024-08-02 09:08:37
898
原创 C自定义类型(结构体,联合体,枚举)详解
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。大多数编译器会使用“最严格对齐原则”,即结构体成员的偏移量应该是成员大小的整数倍,且结构体的大小应该是成员中最大成员大小的整数倍。4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的。结构体的大小通常是其成员大小的总和,但因为对齐规则的存在,结构体的大小可能会大于成员大小的总和。
2024-07-31 14:14:07
1038
原创 常用字符函数
void *memcpy(void *dest, const void *src, size_t n)用于将一块内存区域的数据复制到另一块内存区域。函数在使用时需要确保源内存区域和目标内存区域不重叠,否则会导致拷贝的数据不正确。函数类似,但它能够正确处理源内存区域和目标内存区域重叠的情况。字符转换函数tolower(ch),toupper(ch)memcmp 用于比较两个内存区域中的数据是否相等。用于将一块内存区域中的内容都设置为某个特定的值。
2024-07-27 23:11:25
913
原创 不创建临时变量实现两个数的交换(c)
但这种方法存在溢出的可能 即:int 类型为4字节 = (4*8 )32 位 可表示范围为 -2,147,483,648 到 2,147,483,647 (无符号:2^32 = 4,294,967,296 有符号:-2^32/2~-1 0~2^32/2-1)一种常见的方法是使用位操作来交换变量的值,这种方法利用了异或的特性:对于两个相同的值进行异或运算,结果为0。一般情况,我们使用交换两个数的方法是:引入一个临时变量来进行数的交换。使用乘除法 ,需注意避免除数为零的情况 除数不能为零。
2024-07-17 17:49:25
166
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人