- 博客(73)
- 收藏
- 关注
原创 STM32入门--看门狗
STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
2024-05-24 14:33:27 3758
原创 STM32笔记-AD模数转换
1. 12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。2. ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生的。//eg://选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz但是需要注意的是,如下图,ADCCLK最大14MHz。
2024-05-24 14:30:12 2576
原创 C语言指针入门
如果一个地址序列管理一个内存单元,那么电脑就能管理2^32个字节,即4294967296个字节,是4294967296/1024=4194304kb,是4194304/1024=4096MB,是4GB.先把此时p所指的值赋值给y,即第一个元素5,然后做自增运算,即p所指的值增加了1,为6,输出数组的第一个元素a[0]为6。时,先执行括号里面的*--p,先进行自减,也就是说此时指针p向前移动了一格,即此时指向数组的第一个元素。1. *p=&a[1]时,指针指向数组的第二个元素;
2024-05-19 15:00:14 433
原创 sizeof--关键字
感觉是有一定的参考价值,所以拿出来分享,抛砖引玉。我们知道,对于一个数组array[20],我们使用代码sizeof(array)/sizeof(array[0])可以获得数组的元素(这里为20),但数组名和指针往往是容易混淆的,有且只有一种情况下数组名是可以当做指针的,那就是数组名作为函数形参时,数组名被认为是指针,同时,它不能再兼任数组名。sizeof(array)相当于求指针变量占用的字节数,在32位系统下,该值为4,sizeof(array)/sizeof(array[0])的运算结果也为4。
2024-05-19 14:43:52 743
原创 Linux笔试题
2. 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;writer.c 从管道/home/linux/myfifo中读取内容,写到argv[1]所指定的文件中并保存。reader.c 从argv[1]所指定的文件中读取内容,依次写到管道/home/linux/myfifo中。代码中可省略头文件,/home/linux/myfifo无需创建。3. 编写程序实现如下功能。
2024-03-20 14:32:50 464
原创 Linux信号灯
概念:是不同进程间或一个给定进程内部不同线程间同步的机制。注意:编译posix信号灯需要加pthread动态库。Posix 无名信号灯 (linux只支持线程同步)System V 信号灯。Posix 有名信号灯。
2024-03-14 17:17:39 520
原创 Linux信号机制(二)
只要在5s内按下了CTRL+C就会信号捕获打印handle中的语句,且这个时候因为pause(),再按下CTRL+C会再次运行mytask()。可以发现,当我用CTRL+C,接着运行,之后程序就运行到while(1)里了,当我再CTRL+C因为信号捕获的关系才会打印句柄里的语句I get the sig = 2。信号递达(Delivery ):实际信号执行的处理过程(3种状态:忽略,执行默认动作,捕获)、信号未决(Pending):从产生到递达之间的状态。参数:sigmask:希望屏蔽的信号。
2024-03-13 16:48:33 899
原创 Linux信号机制
这种方式下,进程对收到的信号不做任何响应。这通常用于某些不需要处理的信号,或者是在某些特定情况下临时禁用信号处理器。:这种方式下,进程定义一个信号处理函数,用于处理特定信号。当进程收到指定信号时,会调用这个信号处理函数。这允许程序员自定义对信号的处理方式,概念:信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。然后,你可以在需要的时候使用这个指针来重新设置信号处理函数,从而恢复到先前的处理方式。当程序启动时,通常会有一些默认的信号处理方式。函数会设置一个定时器,在指定的秒数之后,会产生。
2024-03-11 16:32:30 972
原创 线程池概念和使用
然后,函数会再次获取线程池的互斥锁,将新任务添加到任务队列的末尾。接着,函数会增加线程池的忙碌线程数,并通过条件变量通知正在等待的线程有新的任务可以执行。最后,函数释放互斥锁,任务添加完毕。再次尝试获取线程池的互斥锁,以便检查线程池中的忙碌线程数是否已经小于最大容量。通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合。线程池工作线程,它是任务队列,任务的消费者,等待新任务的信号。:完成任务后,将线程池中的忙碌线程数减一,表示当前线程空闲。任务队列,存储需要处理的任务,由工作线程来处理这些任务。
2024-02-21 19:43:23 916
原创 互斥锁/读写锁(Linux)
写者:写者使用写锁,如果当前没有读者,也没有其他写者,写者立即获得写锁;否则写者将等待,直到没有读者和写者。如果互斥锁当前没有被锁住,那么调用将成功,该线程将对互斥锁进行加锁并立即返回。读者:读者使用读锁,如果当前没有写者,读者立即获得读锁;其中mutexattr用于指定互斥锁属性,如果为NULL则使用缺省属性。不能同时访问的资源,比如写文件,只能由一个线程写,同时写会写乱。函数进行解锁,以允许其他线程获得对互斥锁的访问。,不管是读者试图加读锁,还是写者试图加写锁,参数是一个指向互斥锁对象的指针,
2024-01-25 21:59:06 1893 1
原创 Linux线程
4. 线程内的return 可以结束线程,也可以给pthread_join返回值,但不能触发pthread_cleanup_push里面的回调函数,所以我们结束线程尽量使用pthread_exit退出线程。2.pthread_cleanup_pop()被执行且参数为0,pthread_cleanup_push回调函数routine不会被执行。3.thread_cleanup_push 和pthread_cleanup_pop可以写多对,routine执行顺序正好相反。在循环中被调用,以检查是否有取消请求。
2024-01-24 20:25:59 865
原创 Linux进程
在接下来的输出中看到 "This is father process" 和 "father after fork",这证实了这部分代码是在父进程中执行的。函数返回的,它返回的是子进程的进程ID。所以,在父进程中,这个值是子进程的进程ID。父进程的进程ID是3800,而子进程的进程ID是由操作系统动态分配的。3800的父进程ID(PPID)是2728,而3801的父进程ID(PPID)是3800。实现一个进程链,父进程->子进程->孙进程->重孙进程->重重孙进程。为什么需要wait?
2024-01-23 16:08:50 417
原创 创建一个具有十个节点的完全二叉树
创建一个具有十个节点的完全二叉树(注意是完全二叉树)要求:先定义二叉树的节点,该程序返回创建的二叉树的根节点地址。
2024-01-19 11:26:29 628
原创 文件操作函数总结(Linux)
新建一个名为test.txt的文本文件,向文件内输入"This is test.\n"(""内是输入的内容)运行结果为:ABCDEFGHIJKLMNOPQRSTUVWXYZ,其对应的ASCII码值为65-90。也可以采用先关闭再打开文件的方式,但是需要注意文件打开方式:我这里为了省事直接用的a+修改如下:fseek(fp,0,SEEK_SET);示例代码: 打印26个大写字母到1.txt文本。这样始终打印的都是test.c的大小。使用fprintf和sprintf。示例一: 每次只能获取一个字符。
2024-01-18 20:52:34 1605
原创 快速排序算法
结构体变量的三种赋值方式以及三种常见错误的赋值方式-云社区-华为云 (huaweicloud.com)【数据结构】八大排序(超详解+附动图+源码)_数据结构排序-CSDN博客。利用快速排序对以下数据进行排序1,5,7,8,3,5,9,4,1,0。
2024-01-17 16:12:45 367
原创 同步与互斥(三)
F:任务1阻塞时间到后继续运行,使用循环多次获得、释放递归锁。A:任务1优先级最高,先运行,获得递归锁。B:任务1阻塞,让任务2得以运行。E:任务2等待递归锁。
2023-12-25 23:36:48 79
原创 同步与互斥(二)
LPTask先持有二进制信号量,但是MPTask抢占LPTask,使得LPTask一直无法运行也就无法释放信号量,导致HPTask任务无法运行,任务2:任务1阻塞时它开始执行,它先尝试获得互斥量,失败的话就监守自盗(释放互斥量、开锁),然后再上锁。可见,任务1上的锁,被任务2解开了。E:MP Delay时间到,MPTask恢复运行,它比LPTask优先级高,一直运行。A:HPTask优先级最高,它最先运行。任务1:高优先级,一开始就获得互斥锁,永远不释放。A:任务1的优先级高,先运行,立刻上锁。
2023-12-21 23:21:08 94
原创 同步与互斥(一)
这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西,如果不做任何处理的话,打印出来的东西肯定是错乱的。如果A、B同时使用串口,那么打印出来的信息就是A、B混杂,无法分辨。是指散步在不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,只能等到该任务运行完这个程序片段后才可以运行。比如对于串口,任务A正使用它来打印,在打印过程中任务B也来打印,客户看到的结果就是A、B的信息混杂在一起。
2023-12-20 23:31:52 114
原创 FreeRTOS信号量学习
队列(queue)可以用于传输数据:在任务之间、任务和中断之间。有时候我们只需要传递状态,并不需要传递具体的信息,比如:在这种情况下我们可以使用信号量(semaphore),它更节省内存。
2023-12-19 23:20:33 139
原创 FreeRTOS队列基础知识
首先创建一个可以存储 5 个指针的队列,然后在发送 task 中申请一个内存并写入一个字符串,将该内存的指针压入队列。某个任务读队列时,如果队列没有数据,则该任务可以进入阻塞状态:还可以指定阻塞的时间。如果储存在队列中的数据过大,最好是使用数据的指针而不是数据本身。关于malloc所开辟空间类型:malloc只开辟空间,不进行类型检查,只是在使用的时候进行类型的强转。对于有内存保护功能的系统,如果队列使用引用方法,也就是使用地址,必须确保双方任务对这个地址都有访问权限。指针使用的内存的拥有者必须明确定义。
2023-12-13 16:37:07 395
原创 数组越界死循环以及部分内存函数实现
这个程序放到编译器中运行的话会造成死循环,那这时我们可能会想,数组的总元素是10,而循环语句中的i要循环到12才结束,那么肯定会出现数组越界报错啊,但为什么会出现死循环而不是数组越界,并且这个语句为什么会形成死循环呢?下面我来给大家解释。首先我们得先从栈开始讲起(不知道什么是栈的小伙伴可以自己去搜),我们平时创建的局部变量就放在栈中,而栈的使用规则从高地址向低地址使用的。2.&数组名,这个数组名也表示整个数组,取出的是整个数组的地址。,那么这个循环会重新开始,也就造成了死循环。
2023-12-09 17:22:07 188
原创 Linux指令学习
说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾。2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。访问Linux手册页的命令是。
2023-12-06 19:29:15 1329
原创 FreeRTOS入门--任务
要注意的是:这个函数不能返回同一个函数,可以用来创建多个任务;换句话说,多个任务可以运行同一个函数函数内部,尽量使用局部变量:每个任务都有自己的栈每个任务运行这个函数时任务A的局部变量放在任务A的栈里、任务B的局部变量放在任务B的栈里不同任务的局部变量,有自己的副本/* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 *//* 任务函数通常实现为一个无限循环 */for(;;/* 任务的代码 */
2023-12-02 15:13:29 2748
原创 STM32学习笔记--闪存Flash
通过写入特定的序列到FLASH_KEYR寄存器可以打开FPEC模块,这个特定的序列是在FLASH_KEYR写入两个键值(KEY1和KEY2);如果指定的地址在FLASH_WRPR中设定为写保护,则不执行编程并在FLASH_SR寄存器的WRPRTERR位置’1’提出警告。FPEC模块和FLASH_CR寄存器可以由程序设置FLASH_CR寄存器中的LOCK位锁住,这时可以通过在FLASH_KEYR中写入正确的键值对FPEC解锁。检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作;
2023-12-01 17:23:52 666
原创 C语言入门---位操作
因为按位或,又一个规律,1|x = 1;0|x = x,那么与1相或如果是1还是1,如果是0还是1。//相与的结果以%d的形式打印,即打印一个有符号的整数。规定了1111 1111 1111 1111 11111 1111 1111 1111为-1。//而c最高位是0,是正数,原码补码反码都一样,故打印3。//我们求出的是3和-5的补码按位与的结果存在了c里面。4.求一个整数存储在内存中的二进制中1的个数。11.srand与rand。14.枚举初始化与赋值。2.原码、反码、补码。6.将指定的位置置1。
2023-11-27 19:18:20 534
原创 STM32笔记---RTC
RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时实时时钟是一个独立的定时器,RTC模块拥有一组连续计数的计数器,在相应软件的配置下,可以实现提供时钟日历的功能。系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟APB1外设时钟使能寄存器(RCC_APB1ENR)
2023-11-23 19:54:03 2547
原创 C语言--如何交换两个数与对于递归的理解以及数组赋值的注意事项
实参:真是传递给函数的参数,在进行函数调用时,必须有确切的值;形参:指的是函数名括号中的变量,因为形参只在函数调用的时候才实例化(分配内存单元)。字符数组str共有10个元素,但str作为字符串,其长度为7,虽然最后一个字符是‘\0’,但它并不是结束标识因为系统会自动的给其分配一个结束标识。”(这种方式会自动给字符串的末尾添加结束标识,但需要注意的是字符串数组的长度一定要比赋值的长度多一个)//当实参传递给形参的时候,形参是实参的一份临时拷贝。如果成功,则返回写入的字符总数,否则返回一个负数。
2023-11-21 23:17:34 183
原创 STM32笔记—USART
任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据。TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。总线在发送或接收前应处于空闲状态。● 一个起始位● 一个数据字(8或9位),最低有效位在前● 0.5,1.5,2个的停止位,由此表明数据帧的结束● 使用分数波特率发生器 —— 12位整数和4位小数的表示方法。
2023-11-14 22:55:46 1070
原创 STM32笔记—EXTI外部中断
中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行;中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源;中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。(不用开启外设时钟:特殊)EXTI可以监测指定GPIO口的电平信号,当其指定的。
2023-11-09 09:07:27 1828
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人