自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(159)
  • 收藏
  • 关注

原创 Git入门学习笔记

Git 是一个非常强大的!在下载好Git之后,鼠标右击就可以显示 Git Bash 和 Git GUI,Git Bash 就像是在电脑上安装了一个小型的 Linux 系统!1. 打开 Git Bash2. 设置用户信息(git config --global user.name "输入要设置的名字"git config --global user.email "输入要设置的邮箱"查看配置信息3. 为常用的指令配置别名有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。

2024-03-04 11:34:16 806

原创 Linux_Ubuntu 系统入门

由于使用场合、使用环境的不同,Linux 有多种文件系统,不同的文件系统支持不同的体系。ext4 文件系统是在 ext3 上发展起来的,ext4 相比于 ext3 提供了更佳的性能和可靠性,并且功能更丰富,ext4 向下兼容 ext3 和 ext2,因此可以将 ext2 和 ext3 挂载为 ext4。操作系统就是处理各种数据的,这些数据在硬盘上就是二进制,人类是不能直接看懂这些二进制数据的,要先有一个翻译器,将这些二进制的数据还原为人类能看懂的文件形式,这个工作就是由文件系统来完成的,

2023-12-13 21:42:29 1844

原创 C++[面向对象的程序设计]_基础入门(中)(万字总结)(建议收藏!!!)

在内存中执行的实际上是对指针的解引用,拿到的是一个数据;:假设子类中有一个成员函数,但是父类中有100个成员函数,只要这100个成员函数中有一个成员函数和子类的成员函数同名,那么子类的这一个成员函数会隐藏掉父类中100个成员函数,这个需要特别注意,不是隐藏一个,而是隐藏掉100个成员函数,如果程序中调用父类的成员函数,就会报错,因为被隐藏掉了,需要加作用域;首先引用函数 Swap03 的参数是 int &a,相当于变量 a 起了个别名,别名是可以和原变量一个名字的,别名是具有和原变量相同的功能的;

2023-12-11 11:11:05 1272

原创 C++[面向对象的程序设计]_基础入门(上)(万字总结)(建议收藏!!!)

学校正在做毕设项目,每名老师带领 5 个学生,总共有 3 名老师,需求如下:设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放 5 名学生的数组作为成员,学生的成员有姓名、考试分数,创建数组存放 3 名老师,通过函数给每个老师及所带的学生赋值,最终打印出老师数据以及老师所带的学生数据。这也证明了数组中的元素在内存中是连续存放的!这样对初学者来说,可能不清楚 i 对应的究竟是哪一个循环,如果了解过的可能清楚,嵌套循环中的变量遵循就近原则,也就是离哪个循环越近,变量就属于哪一个循环。

2023-12-06 15:59:17 1336 1

原创 Linux_虚拟机常用目录汇总

cd /home/alientek/alpha //cd 和 / 之间有一个空格。:~ 表示用户目录,也称为家目录。cd 和 ~ 之间有个空格!:只能由根目录写起,例如写到 alpha 目录下。:不是由根目录写起,例如写到 alpha 目录下。:执行 pwd 指令即可看到当前所在的路径信息。:/ 表示根目录,cd和 / 之间有个空格!

2023-11-16 20:01:25 820

原创 Linux_VMware 软件安装与虚拟机

之前学习过的不管是 51 单片机还是 STM32 单片机都是在 Windows 系统下进行的,使用 MDK 这样的集成 IDE,但是嵌入式 Linux 驱动开发需要的主机是 Linux 平台的,所以必须先在自己的电脑上安装 Linux 系统,Linux 系统发行版有 Ubuntu 、CentOS 等等,我们选择使用 Ubuntu 操作系统!这里的虚拟机名称设置为 Ubuntu 64 位,位置设置为我们之前设置的分区(最好是一个单独的分区,这里我设置的是 Z:\)虚拟机的创建和我们配置一台主机是差不多的!

2023-11-16 19:10:15 766

原创 Linux_正点VMware Workstation Pro 密钥

VMware Workstation Pro 17 密钥

2023-11-16 09:58:47 1480 3

原创 FreeRTOS_内存管理

如果此时有个应用需要 50B 的内存,那么它可以从两个地方来获取到,一个是最前面的还没被分配过的剩余内存块,另一个就是刚刚释放出来的 80B 的内存块。heap_2 不会把释放的内存块合并成一个大块,这样有一个缺点,随着不断的申请内存,内存堆就会被分为很多个大小不一的内存(块),也就是会导致内存碎片!任务会不断的获取按键情况,当检测到 KEY_UP 按下的时候就会申请内存,当 KEY0 按下以后就会使用申请到的内存,如果检测到 KEY1 按下的话就会释放申请到的内存。

2023-11-09 20:15:55 271

原创 FreeRTOS_空闲任务

空闲任务还有另外一个重要的职责,如果某个任务要调用函数 vTaskDelete() 删除自身,那么这个任务的任务控制块 TCB 和任务堆栈等这些由 FreeRTOS 系统自动分配的内存需要在空闲任务中释放掉,如果删除的是别的任务那么相应的内存就会被直接释放掉,不需要在空闲任务中释放。顾名思义,空闲任务就是处理器空闲的时候去运行的一个任务,当系统中没有其他就绪任务的时候空闲任务就会开始运行,空闲任务最重要的作用就是让处理器在无事可做的时候找点事做,防止处理器无聊,因此,空闲任务的优先级必然是最低的。

2023-11-08 21:50:41 616

原创 FreeRTOS_低功耗Tickless模式

如果处理器在进入低功耗模式之前能够获取到还有多长时间运行下一个任务那么问题就迎刃而解了,我们只需要设置一个定时器,定时器的定时周期设置为这个时间值就可以了,定时时间到了以后产生定时器中断,处理器就从低功耗模式中唤醒了。一般的简单应用中处理器大量的时间都在处理空闲任务,所以我们就可以考虑当处理器处理空闲任务的时候就进入低功耗模式,当需要处理应用层代码的时候就将处理器从低功耗模式中唤醒。很多 MCU 都有相应的低功耗模式,以此来降低设备运行时的功耗,进行裸机开发的时候就可以使用这些低功耗模式。

2023-11-07 19:59:01 576

原创 FreeRTOS_任务通知

当任务通知用于替代二值信号量的时候任务通知值就会代替信号量值,函数 ulTaskNotifyTake() 就可以代替信号量获取函数 xSemaphoreTake(),函数 ulTaskNotifyTake() 的参数 xClearCountOnExit 设置为 pdTRUE。pxHigherPriorityTaskWoken: 记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置,用户不用进行设置,用户只需要提供一个变量来保存这个值就可以了。

2023-11-06 20:01:15 425

原创 FreeRTOS_事件标志组

由于内部处理的原因,事件标志组可用的 bit 数取决于 configUSE_16_BIT_TICKS,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组有 8 个可用的位(bit 0 ~ bit 7),当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组有 24 个可用的位(bit 0 ~ bit 23)。实验还创建了一个事件标志组:EventGroupHandler,实验中用到了这个事件标志组的三个事件位,分别位 bit0,bit1 和 bit2。

2023-11-04 21:56:35 455

原创 FreeRTOS_软件定时器

MCU 自带的定时器属于硬件定时器,不同的 MCU 其硬件定时器数量不同,因为要考虑成本的问题。如果定时器服务任务的优先级设置的高的话,定时器命令队列中的命令和定时器回调函数就会及时的得到处理。定时器 AutoReloadTimer_Handle 的定时器周期为 1000 个时钟节拍(1s),定时器 OneShotTimer_Handle 的定时器周期为 2000 个时钟节拍(2s)。由于定时器服务任务中会执行定时器的回调函数,因此任务堆栈的大小一定要根据定时器的回调函数来设置。

2023-11-03 15:58:01 438

原创 FreeRTOS_信号量之递归互斥信号量

一个任务使用函数 xSemaphoreTakeRecursive() 成功的获取了多少次递归互斥信号量就得使用函数 xSemaphoreGiveRecursive() 释放多少次!递归互斥信号量也有优先级继承的机制,所以当任务使用完递归互斥信号量以后一定要记得释放(如果不释放那么低优先级的任务的优先级将永远和高优先级任务保持一致)。已经获取了互斥信号量的任务就不能再次获取这个互斥信号量,但是递归互斥信号量不同,已经获取了递归互斥信号量的任务可以再次获取这个递归互斥信号量,而且次数不限。

2023-11-01 22:12:36 338

原创 FreeRTOS_信号量之互斥信号量

意思就是说:低优先级的任务获得互斥信号量,此时高优先级的任务无法访问获得互斥信号量,其他中等优先级的任务也无法获得互斥信号量,这样一来,低优先级任务就不能被中等优先级任务所打断,高优先级任务只需要等待低优先级任务释放互斥信号量即可,不用担心被其他的中等任务所打断;:低优先级任务正在使用互斥信号量,而高优先级任务请求使用互斥信号量,此时会临时的将低优先级任务的优先级提高到和高优先级任务一个层次,这时被提升上来的任务就不会被其他优先级任务所打断,最大程度保证高优先级任务尽快获得互斥信号量,提高系统的响应性能。

2023-11-01 20:54:29 872

原创 FreeRTOS_信号量之优先级翻转

综上所述,任务 H 的优先级实际上降到了任务 L 的优先级水平。由于任务 M 剥夺了任务 L 的 CPU 使用权,使得任务 H 的情况更加恶化,这样就相当于任务 M 的优先级高于了任务 H,导致优先级翻转。如果低优先级任务获取到了信号量,那么高优先级任务就会处于等待状态,但是,中等优先级任务可以打断低优先级任务而先于高优先级任务运行!(6)、任务 H 运行过程中也要使用任务 L 正在使用着的资源,由于该资源的信号量还被任务 L 占用着,任务 H 只能进入挂起状态,等待任务 L 释放该信号量。

2023-10-31 10:19:59 267

原创 FreeRTOS_信号量之计数型信号量

(1)、计数型信号量也是在队列的基础上实现的,所以需要调用函数 xQueueGenericCreate() 创建一个队列,队列长度为 uxMaxCount,队列项长度为 queueSEMAPHORE_QUEUE_ITEM_LENGTH (此宏为 0 ),队列的类型为 queueQUEUE_TYPE_COUNTING_SEMAPHORE,表示是个计数型信号量。另外一个任务获取信号量,当信号量获取成功以后就刷新 LCD 上指定区域的背景颜色,并且显示计数型信号量的值。当信号量值为 0 的时候说明没有资源了。

2023-10-31 09:31:04 204

原创 FreeRTOS_信号量之二值信号量

现在使用二值信号量就可以实现这样的功能,任务通过获取信号量来判断是否有网络数据,没有的话就进入阻塞态,而网络中断服务函数(大多数的网络外设都有中断功能,比如 STM32 的 MAC 专用 DMA 中断,通过中断可以判断是否接收到了数据)通过释放信号量来通知任务以太网外设接收到了网络数据,网络任务可以去提取处理了。具体的处理过程做成一个任务,这个任务会获取信号量,如果获取到信号量就说明中断发生了,那么就开始完成相应的处理,这么做的好处就是中断执行的时间非常短。,在这个案例中使用的就是计数型信号量。

2023-10-30 22:02:25 551

原创 STM32F4_网络通信(网口)

STM32F4 芯片自带以太网模块,该模块包括带有专用 DMA 控制器的 MAC 802.3(介质访问控制)控制器,支持介质独立接口(MII)和简化介质独立接口(RMII),并自带了一个用于外部PHY通信的SMI接口,通过一组配置寄存器,用户可以为 MAC 控制器和 DMA 控制器选择所需的模式和功能。STM32F4必须外接PHY芯片,才可以完成以太网通信,外部PHY芯片可以通过 MII/RMII 接口与STM32F4 内部MAC连接,并且支持 SMI (MDIO&MDC)接口配置外部以太网PHY芯片。

2023-10-22 20:41:17 5602

原创 STM32F4_USB读卡器(USB_Slave)/USB U盘(Host)

的缩写,是一个外部总线标准,用以规范电脑与外部设备的连接和通讯。,同时支持从机功能和主机功能,完全符合USB 2.0规范的On-The-Go(就是OTG,实现在没有Host主机的情况下,实现设备间的数据传送)补充标准。根据之前的学习,我们知道如果是高速设备,那么D+上会接一个1.5K的上拉电阻到VCC,如果是低速设备,那么D-上会接一个1.5K的上拉电阻到VCC;主机模式下,OTG FS支持全速(FS,12Mb/s)和低速(LS,1.5Mb/s)收发器,在从机模式下仅支持全速(FS,12Mb/s)收发器。

2023-10-22 20:40:49 3598

原创 STM32F4_音乐播放器

只在部分chunk中用到,如 “WAVE chunk” 中,它表示的意义是下面嵌套有别的chunk,当使用了 “类型块标识” 时,该chunk中就没有别的项(如块标志等,数据大小等),它只作为文件读取时的一个标识(类似于链表中的指针域,指向下一个数据域,起一个导向的作用)。,该寄存器要设置ROUT1EN(bit8),LOUT1EN(bit7)和SLEEP(bit6)等三个位,ROUT1EN 和 LOUT1EN,设置为 1,使能耳机输出,SLEEP 设置为 0,进入正 常工作模式。作为标示(注意有个空格!

2023-10-22 19:38:15 1834

原创 STM32F4_照相机

依 次循环(此时的数据处理,是通过 DMA 传输完成中断实现的,在中断里面处理),直到帧中断, 结束一帧数据的采集,读取剩余数据到外部 SRAM,完成一次 JPEG 数据的采集。M0AR,M1AR所指向的内存,必须是内部内存,不过由于采用了双缓冲机制,我们不必定义一个很大的数组,一次性接收所以的JPEG数据了,而是可以分批次接收,数组可以定义的比较小。我们要保存 BMP,当然要存放在某个地方(文件),所以需要先创建文件,同时先保存 BMP 位图信息,之后才开始 BMP 数据的写入。

2023-10-22 19:37:42 208

原创 STM32F4_中英文显示

我们的点阵库只要按照这个编码规则从0x8140开始,逐一建立,每个区的点阵大小为每个汉字所用的字节数*190(每个区有190个汉字,190乘以每个汉字所占的字节数=该区总的字节数,也就是每个区的点阵大小)汉字在各种文件里面的存储不是以点阵数据的形式存储的(否则那占用的空间就太大了),而是以内码的形式(1个高8位,1个低8位)存储的,就是GB2312/GBK/BIG5等这几种的一种,每个汉字对应着一个内码,再知道这个内码之后再去字库里面查找这个汉字的点阵数据,然后在液晶上显示出来。

2023-10-22 19:35:55 434

原创 STM32F4_FATFS

就比方说我们自己的电脑上,我们的硬盘都是几百个G的容量,我们天天的往里存放各种各样的文件,有文档文件,有音乐文件,有视频文件。:在已知各文件首簇的前提下,从首簇开始,对于文件满一簇的数据,把整簇数据读出(按照扇区来读,一次性读出整个扇区),对于文件结尾不足一簇的部分,计算它占用簇内几个扇区,把占用整个扇区部分直接按照扇区读出,而最后很大可能是零散的若干个字节,不足一个扇区,也就是占用了最后一个文件的最后一个扇区的一部分(对于这部分来讲我们也要将整个扇区读出,截选中有效的数据部分),。

2023-10-22 19:35:03 472

原创 FreeRTOS_队列

这三个函数都是用于向队列中发送消息的,这三个函数的本质都是宏,其中函数 xQueueSend() 和 xQueueSendToBack() 是一样的,都是后向入队,也就是将新的消息插入到队列的后面。此函数也是向队列发送数据的,当队列满了以后会覆写掉旧的数据,不管这个旧数据有没有被其他任务或中断取走。这里我们创建一个长度为 4 的队列,因为要传递的是 x 的值,而 x 是个 int 类型的变量,所以每条消息的长度就是 int 类型的长度,在 STM32 中就是 4 字节,即每条消息是 4 个字节的。

2023-10-22 11:25:24 196

原创 操作系统_文件管理(三)

找到文件后,它的 FCB 会复制到整个系统的打开文件表中。文件对象包含与该文件相关联的目录项对象,包含该文件的文件系统、文件指针等,还包含在该文件对象上调用的一系列操作函数。:超级块对象对应于磁盘上特定扇区的文件系统超级块,用于存储已安装文件系统的元信息,元信息中包含文件系统的基本属性信息,如文件系统类型、文件系统基本块的大小、文件系统所挂载的设备、操作方法(函数)指针等。当所有打开某个文件的用户都关闭该文件后,任何更新的元数据将复制到磁盘的目录结构中,并且整个系统的打开文件表的对应条目也会被删除。

2023-08-29 20:33:39 336

原创 操作系统_文件管理(二)

用户 B 仍可以使用该文件。为使用户 B 能共享用户 A 的一个文件 F,可以由系统创建一个 LINK 类型的新文件,也取名为 F,并将该文件写入用户 B 的目录中,以实现用户 B 的目录与文件 F 的链接。当用户 B 要访问被链接的文件 F 且正要读 LINK 类新文件时,操作系统查看到要读的文件时 LINK 类型,则根据该文件中的路径去找到文件 F,然后对它进行读,从而实现用户 B 对文件 F 的共享。当删除一个文件时,先从该目录中找到该文件的目录项,回收该文件所占用的存储空间,然后清除该目录项。

2023-08-29 20:26:30 311

原创 操作系统_文件管理(一)

一个进程通常只对一个文件读或写,(也就是说我们想要对一个文件执行读或者写的操作时,我们在用户层通过系统调用请求操作系统服务,操作系统会创建一个进程,分配相关空间和创建一个进程控制块,通过该进程执行对文件的读或者写的操作,这一系列的操作都是操作系统来完成的),因此当前操作位置可作为每个进程当前文件位置的指针。最简单的索引顺序文件只使用了一级索引。一个文件的目录项中 “文件物理地址” 字段应包括第一块的地址和该文件所分配区域的长度,若文件长 n 块并从位置 b 开始,则该文件将占有块 b,b+1,b+2,……

2023-08-29 14:21:47 1033

原创 STM32F4_SD卡

要使用SD卡制造商特定的ACMD命令,需要在发送该命令之前发送CMD55命令,告知SD卡接下来的命令为特定应用命令,CMD55只对紧接着的第一个命令有效,SD卡如果检测到CMD55之后的命令为ACMD则执行特定应用命令,如果检测发现不是ACMD命令,则执行常规命令GEN_CMD;卡及接口控制单元的8个寄存器只能通过对应的命令去访问,SDIO定义了64个命令,每个命令都有特殊的意义,可以实现某一特定的功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,从而实现SD卡的控制及读写操作;

2023-08-28 20:25:05 1166

原创 操作系统_内存管理(二)

此时应将缺页的进程阻塞(调页完成唤醒),若内存中没有空闲块,则分配一个块,将要调入的页装入该块,并修改页表中的相应页表项,若此时内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存)。进程在运行中需要访问的页面不在内存,便提出请求,由系统将其所需的页面调入内存。一旦程序访问了某个存储单元,在不久后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。

2023-08-19 19:39:22 508 1

原创 操作系统_内存管理(一)

12 位,页号部分为 20 位,若不采用分级页表,则仅页表就要占用 220x4B/4KB = 1024 页,这大大超过了许多进程自身需要的页面,对于内存来说是非常浪费资源的,而且查询页表工作也会变得十分不便、试想若把这些页表放在连续的空间内,查询对应页的物理页号时可以通过页表首页地址+页号x4B的形式得到,而这种方法查询起来虽然相对方便,但连续的1024 页对于内存的要求实在太高,并且上面也说到了其中大多数页面都是不会用到的,所以这种方法并不具有可行性。下图是一个进程在内存中的映像。

2023-08-19 15:58:54 998

原创 STM32F4_内存管理(Malloc、Free)

当指针p调用malloc函数动态申请内存的时候,先去判断指针p要分配的内存块数m,然后从末端开始查找,直到找到m块连续的空内存块,然后把这m块空的内存块的内存管理项设置为m,表示对应块的内存被占用,最后将这m块对应的内存块地址返回给指针p,完成一次分配。KEY2用于释放内存。我们在使用一块内存的时候,通常都不会恰到好处的使用完定义的内存,可能我们定义的内存不够我们使用,也可能我们定义的内存会多,这样会造成内存浪费;内存池被等分为n块,对应的内存管理表大小也为n,内存管理表的每一项对应内存池的一块内存。

2023-08-02 11:36:46 2886

原创 STM32F4_外部SRAM

因为数据宽度是16位的,所以一行可以存放2个字节,每次写入一个字节,那么就需要分别写入这16位的高8位和低8位,那么就需要借助I/O0-I/O7、I/O8-I/O15数据线分别写入这16位的高字节和低字节)因为SRAM读取数据是异步通讯,也就是没有时钟总线,也可以说是双方没有规定好时间,那么我将要读取的地址发送以后,就需要给出一定的反应时间(因为没有时钟,不是同步通信),也就是图中程序区域的。对于一般的应用来说,192K字节已经够用了,但是对于那些对内存要求比较高的,192K字节是远远不够用的;

2023-08-02 10:38:54 2293

原创 STM32F4_图片显示

是最常用的文件图像格式,由一个软件开发联合会组织制定,同 BMP 格式不同,JPEG 是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料 会被丢失,因此容易造成图像数据的损伤(BMP 不会,但是 BMP 占用空间大)。但是 JPEG 压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获 得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得 到较好的图像品质。2. 位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。

2023-08-02 09:47:17 1336

原创 操作系统_进程与线程(四)

安全性算法是银行家算法的核心,在银行家算法的题目中,一般会有某个进程的一个资源请求向量,读者只要执行上面所介绍的银行家算法的前三步,马上就会得到更新的 Allocation 矩阵和 Need 矩阵,再按照上例的安全性算法判断,就能知道系统能否满足进程提出的资源请求。例如,进程 A 等待进程 B 发的消息,进程 B 又在等待进程 A 发的消息,可以看出进程 A 和 B 不是因为竞争同一资源,而是在等待对方的资源导致死锁。即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。

2023-07-31 20:02:42 271

原创 操作系统_进程与线程(三)

首先设置临界区意愿数组,P0 进程首先表达自己想要进入临界区的意愿,然后将 turn 设置为 1 ,表示谦让,我愿意让 P1 进程先进入临界区,然后通过 while 去判断 P1 进程是否也有进入临界区的意愿,如果 P1 进程有进入临界区的意愿,并且 P0 进程也愿意让 P1 优先进入临界区,那么 P0 进程的 while 循环成立,P0 进程等待,P1 进程进入临界区;当有进程存在于临界区时,S 的值为 0,再有进程要进入临界区,执行 P 操作时将会被阻塞,直至在临界区中的进程退出,

2023-07-31 11:43:50 351

原创 操作系统_进程与线程(二)

这个时候 P1 进程上处理机运行,但是 P1 进程只运行 1 个时刻,P4 进程就会到达, P4 进程会被插入到队尾,这里注意,因为 P1 进程的处理机还没有用完,所以暂时不会进行调度,P1 进程仍然处于运行态;若没有处理机调度,意味着要等到当前执行的进程执行完毕后,下一个进程才能执行,而实际情况中,进程时常需要等待一些外部设备的输入,而外部设备的速度和处理机相比是非常缓慢的,若让处理机总是等待外部设备,则对处理机的资源是极大的浪费。而对于短作业,需要消耗的处理机时间较短,因此能提高系统的吞吐量。

2023-07-30 16:17:41 322

原创 操作系统_进程与线程(一)

这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行、何时停顿,也无法看出它与其他执行程序的关系,因此,程序这个静态的概念已不能如实反映程序并发执行过程的特征。如果存在另外一个进程,那么另外一个进程也会使用上述一系列寄存器,那么可能会导致另一个进程的值覆盖上一个进程的值,为了防止这种现象的发生,上一个进程的时间片结束后,需要保存上一个进程的现场;某进程中的线程对其他进程不可见。

2023-07-23 10:13:32 440

原创 STM32F4_串口 IAP

在执行完 IAP 以后(也就是将新的 APP 代码写入STM32F4 的 FALSH,也就是上图中灰底的部分,新程序的复位中断向量起始地址为0x08000004+N+M),跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的 main 函数,如图标号 ②和③ 所示;这样一来,整个STM32F4的SRAM分配情况为:最开始的4K给BootLoader程序使用,随后的100K存放APP程序,最后24K,用作 APP 程序的内存。

2023-07-18 16:00:35 676

原创 STM32F4_FLASH模拟EEPROM

在实际发布的产品中,STM32芯片的内部FLASH存储了控制程序,如果不做任何保护措施的话,可以使用下载器直接把内部FLASH的内容读取回来,得到bin或hex文件格式的代码拷贝,别有用心的厂家可能会利用该代码制造山寨产品、为此,STM32芯片提供了多种方式保护内部FLASH的程序不被非法读取,但是在默认状态下该保护功能是不开启的,若要开启该功能,需要改写内部FLASH选项字节(Option Bytes)中的配置。系统复位后,CPU时钟频率为内部16M RC振荡器,LATENCY默认是0,即一个等待周期。

2023-07-18 15:45:04 2191

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除