当前位置: 首页 > news >正文

学做网站的网站藁城区建设局网站

学做网站的网站,藁城区建设局网站,erp系统好上手吗,余姚外贸网站建设FreeRTOS工程创建 下载STM32CubeMX尽量找网盘下载#xff08;只是建议#xff0c;没有说官网不行#xff09; 1.创建 STM32CubeMX 工程 #xff08;1#xff09;双击运行 STM32CubeMX#xff0c;在首页面选择“Access to MCU Selector”#xff0c;如下图所示#xff1…FreeRTOS工程创建 下载STM32CubeMX尽量找网盘下载只是建议没有说官网不行 1.创建 STM32CubeMX 工程 1双击运行 STM32CubeMX在首页面选择“Access to MCU Selector”如下图所示 2然后来到 MCU 选型界面在序列号那里输入想要开发的芯片作者使用的是STM32F103C8T6 2.配置时钟 1先配置处理器的时钟在“System Core”的“RCC”处选择外部高速时钟源和低速时钟 源。DshanMCU-F103 使用了外部高速时钟源如下图所示 2另外本实验使用了 FreeRTOSFreeRTOS 的时基使用的是 Systick而 STM32CubeMX 中默认的 HAL 库时基也是 Systick为了避免可能的冲突最好将 HAL 库的时基换做其它的硬 件定时器 3最后去时钟配置界面配置系统时钟频率。直接在 HCLK 时钟那里输入 MCU 允许的最高时 钟频率。F103 的最高频率是 72Mhz所以直接在那里输入 72 然后按回车 3.配置 FreeRTOS 1STM32CubeMX 已经将 FreeRTOS 集成到工具中并且将 RTOS 的接口进行了封装 CMSIS-RTOS V1/V2相较之于 V1 版本的 CMSIS-RTOS APIV2 版本的 API 的兼容性更高为了将来的开发和移植建议开发者使用 V2 版本的 API 2FreeRTOS 的参数包括时基频率、任务堆栈大小、是否使能互斥锁等等需要开发者根 据自己对 FreeRTOS 的了解以及项目开发的需求来定制参数 3使用 STM32CubeMX可以手工添加任务、队列、信号量、互斥锁、定时器等等。但是本 课程不想严重依赖 STM32CubeMX所以不会使用 STM32CubeMX 来添加这些对象而是手写代 码来使用这些对象。 使用 STM32CubeMX 时有一个默认任务此任务无法删除只能修改其名称和函数类型 4.生成 Keil MDK 的工程 1当对外设配置完成后就去“Project Manager”中设置工程的名称、存储路径和开发 IDE 2随后去同界面的“Code Generator”设置、生成工程 5.问题  由于不同的STM32CubeMX软件的版本可能不同我在配置之后打开Keil发现按照以上方法配置会报错这可能是你所使用STM32CubeMX 版本不匹配所导致的只要打开如图 找见Firmware Package Name and Version,之后尝试修改版本即可 创建多任务程序 1系统默认线程理解 在FreeRTOS微型操作系统中文件FreeRTOS.c存放着默认的线程代码FreeRTOS与RT-Thread都属于微型实时操作系统但是他们的代码不通用所以有一个对实时操作系统的一个进行分装的文件cmsis_os2.c进行分装他们类似也有例如oled有不同型号所以也要有文件对他们进行封装lcd.c文件 在FreeRTOS.c中 这段代码就是创建了一个默认的Thread osThreadNew方法属于cmsis_os2.c的一个基于FreeRTOS的方法 osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr)函数简介 osThreadNew 是一个用于创建新线程并将其添加到活动线程列表中的函数。参数解析 func线程函数的指针这是线程启动后要执行的函数。 就是这个线程启动要执行的代码的函数的名字 /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void *argument) {/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */LCD_Init();LCD_Clear();for(;;){//Led_Test();LCD_Test();//MPU6050_Test(); //DS18B20_Test();//DHT11_Test();//ActiveBuzzer_Test();//PassiveBuzzer_Test();//ColorLED_Test();//IRReceiver_Test();//IRSender_Test();//LightSensor_Test();//IRObstacle_Test();//SR04_Test();//W25Q64_Test();//RotaryEncoder_Test();//Motor_Test();//Key_Test();//UART_Test();}/* USER CODE END StartDefaultTask */ }/* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application *//* USER CODE END Application */ argument传递给线程函数的参数可以是任何类型的指针这个指针将在线程启动时作为参数传入一般看需求 attr线程属性的指针。如果设置为 NULL则会使用默认值创建线程。这些属性可能包括线程的优先级、栈大小等设置。 defaultTaskHandle osThreadNew(StartDefaultTask, NULL, defaultTask_attributes); osThreadNew函数的返回值实际上是一个osThreadId_t类型的值 defaultTask_attributes返回的是结构体值                                                                                                                                                                                                                                                 /* Definitions for defaultTask */ osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes {.name defaultTask,.stack_size 128 * 4,.priority (osPriority_t) osPriorityNormal, }; 返回值 osThreadId_t返回新创建线程的 ID以便其他函数可以引用这个线程。 如果创建失败返回值将是 NULL表示发生了错误。总结 这个函数的目的是方便开发者创建多线程应用允许用户指定线程的功能和参数同时支持自定义线程属性 2自己创建一个线程 找见如图所示位置 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */const configSTACK_DEPTH_TYPE usStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreatedTask ) 参数解释 pxTaskCode 类型TaskFunction_t描述指向任务函数的指针该函数包含任务的代码逻辑。 pcName 类型const char * const描述任务的名称用于调试和识别任务。可以是任意字符串但最好简短且有意义。 usStackDepth 类型const configSTACK_DEPTH_TYPE描述任务堆栈的深度通常以堆栈大小字为单位。这个参数定义了任务可以使用的内存量。 pvParameters 类型void * const描述传递给任务的参数可以是任何类型的指针。任务内可以通过这个参数获取相关数据。 uxPriority 类型UBaseType_t描述任务的优先级数值越大优先级越高。FreeRTOS 支持多个优先级。 pxCreatedTask 类型TaskHandle_t * const描述用于接收创建的任务的句柄便于后续管理如删除、挂起等。 返回值 返回值类型BaseType_t描述函数调用成功时返回 pdPASS失败时返回 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 等错误码。 总结 这个函数的主要作用是创建一个新的任务并为其分配堆栈空间和其他资源以便在 FreeRTOS 环境中并发执行多个任务。 书写你的线程代码找见位置 基于汇编对ARM架构的简单理解 1.汇编的简单学习 PUSH 在汇编语言中PUSH指令用于将数据压入栈中。这是一个非常重要的操作特别是在函数调用、保存寄存器值以及处理局部变量时。下面是关于PUSH指令的一些基本内容 基本概念 栈栈是一种后进先出LIFO的数据结构通常用于临时存储数据。PUSH指令将指定的值压入栈顶并自动调整栈指针。 表示将r4到r7以及LR压入栈中SP寄存器自动调整栈顶内容 MOV 基本功能MOV 指令用于将数据从一个位置复制到另一个位置可以是寄存器、内存或立即数。语法MOV destination, source操作数类型 可以是寄存器与寄存器之间的复制。可以是寄存器与内存之间的复制。可以是立即数与寄存器或内存之间的复制。示例 MOV AX, 5 ; 将立即数5加载到AX寄存器 MOV BX, AX ; 将AX寄存器的值复制到BX寄存器MOVS 基本功能MOVS 指令用于在处理字符串时将源地址指向的数据移动到目标地址。它通常用于复制字节、字或双字常与 ESI 和 EDI 寄存器配合使用。语法MOVSB, MOVSW, MOVSD操作数类型 MOVSB移动字节8位。MOVSW移动字16位。MOVSD移动双字32位。自动更新指针执行后ESI 和 EDI 指针会自动增加以准备下一个数据项的复制。 MOVSB ; 将ESI指向的字节复制到EDI指向的字节并自动更新指针 MOVSW ; 将ESI指向的字复制到EDI指向的字 MOVSD ; 将ESI指向的双字复制到EDI指向的双字MOV与MOVS区别 总结 用途不同 MOV 用于通用的数据传输。MOVS 系列用于字符串或块数据的复制。 指针更新 MOV 不会自动更新任何指针。MOVS 在操作后会自动更新 ESI 和 EDI 寄存器。 操作数类型 MOV 可以处理多种数据类型和操作数。MOVS 专注于字节、字和双字的移动。 SUB 在汇编语言中SUB 指令用于执行减法操作。它从一个操作数中减去另一个操作数并将结果存储在第一个操作数中。以下是关于 SUB 指令的一些详细信息 基本概念 功能SUB 指令用于从第一个操作数中减去第二个操作数。语法SUB destination, source destination要进行减法运算的目标位置通常是寄存器或内存。source要减去的值可以是寄存器、立即数或内存。 SUB AX, BX ; 将BX寄存器的值从AX寄存器中减去结果存储在AX中LDRD  LDRD 是一种汇编指令通常用于 ARM 体系结构中。它的功能是从内存中加载双字通常是 64 位或 32 位到寄存器中。以下是关于 LDRD 指令的一些详细信息 基本概念 功能LDRD 从内存中加载两个连续的数据项到两个寄存器中。语法LDRD destination1, destination2, [address] destination1 和 destination2 是要加载数据的寄存器。[address] 是内存地址指向要加载的数据的起始位置。 LDRD R0, R1, [R2] ; 从R2指向的内存地址加载数据R0加载低地址的数据R1加载高地址的数据ADD ADD 是一种基本的汇编指令用于执行加法操作。它通常用于将两个操作数相加并将结果存储在指定的目标寄存器中。以下是关于 ADD 指令的一些详细信息 基本概念 功能ADD 将两个操作数相加并将结果存储在第一个操作数中。语法ADD destination, source1, source2 destination用于存储结果的寄存器或内存位置。source1 和 source2要相加的两个操作数可以是寄存器、立即数或内存。 ADD R0, R1, R2 ; 将R1和R2的值相加结果存储在R0中STR STR 是一种汇编指令主要用于将寄存器中的数据存储到内存中。以下是关于 STR 指令的一些详细信息 基本概念 功能STR 将一个寄存器的值存储到指定的内存地址。语法STR source, [address] source要存储的寄存器。[address]目标内存地址可以是直接地址或通过基址加偏移量计算得出。 STR R2, [R3, #4] ; 将寄存器R2中的值存储到R3指向的内存地址加上4的偏移量POP POP 是一种汇编指令用于从栈中弹出数据并将其存储到指定的寄存器或内存位置。以下是关于 POP 指令的一些详细信息 基本概念 功能POP 从栈顶弹出一个值并将其存储到指定的目标寄存器或内存地址中。语法POP destination destination要接收弹出值的寄存器或内存位置 POP {R1, R2, R3} ; 同时从栈中弹出值到寄存器 R1, R2 和 R32.volatile volatile 关键字是一种类型修饰符用它声明的类型变量表示可以被某些编译器未知的因素更改比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量编译器对访问该变量的代码就不再进行优化从而可以提供对特殊地址的稳定访问。声明时语法int volatile vInt; 当要求使用 volatile 声明的变量的值的时候系统总是重新从它所在的内存读取数据即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。 底层栈区细节请看 3.ARM内部架构简单理解 执行的是以下代码 cnt add(cnt, 1); 执行的是以下代码 int add(volatile int a, volatile int b) {volatile int sum;sum a b;return sum; } 这个是地址码 这个是地址码对应的数据在Flash中 这个是为人类设计的汇编代码 add函数代码汇编解析  int add(volatile int a, volatile int b) {volatile int sum;sum a b;return sum; } 1PUSH  {r0,r1,1r} 在栈区分配三个长度为4的内存空间分别为r0,r1,LR sp这个地址在的栈区减12 2SUB sp,sp,#4 再分配一个空间用来存放sum 3LDRD r0,r1,[sp,#4] 读取(sp4)地址以上的r0,r1的值 4ADD r0,r0,r1 r0r0r1; 5STR r0,[sp,#0] 将r0赋值给[sp0]地址下的值sum 6POP {r1-r3,pc} 将LR寄存器指向的值给pc寄存器返回r1,r2,r3 4.PC寄存器 程序计数器PCProgram Counter是CPU中的一个特殊寄存器它的主要功能是存储下一条要执行的指令的地址。这样CPU就能够知道接下来需要执行哪一条指令从而保证程序的连续执行。在程序开始执行前程序的首地址即第一条指令所在的内存单元地址会被送入PC。当执行指令时CPU会自动修改PC的内容使其始终指向将要执行的下一条指令的地址。大多数情况下指令是顺序执行的所以PC的值通常会自动递增递增的量等于指令所含的字节数。当遇到转移指令时下一条指令的地址将由转移指令的地址码字段来指定而不是简单地通过递增PC的值来获取 。 在ARM架构中程序计数器PCR15是唯一的并且被所有模式共用。ARM处理器中使用R15作为PC它总是指向取指单元。ARM处理器可以寻址4GB的地址空间这是因为R15有32位宽度。在ARM状态下R15的值总是能被4整除也就是R15寄存器的最低2位总是0而在Thumb状态下R15的值总是能被2整除也就是R15寄存器的最低位总是0 。 PC寄存器在计算机系统中扮演着重要的角色它是CPU内部的重要组成部分能够直接与CPU进行数据交换提高数据的处理速度。同时PC寄存器还可以协助CPU完成各种复杂的运算和控制操作使得计算机系统能够高效、稳定地运行 。 在JVMJava虚拟机中PC寄存器是对物理PC寄存器的一种抽象模拟。它用来存储指向下一条指令的地址也即将要执行的指令代码。JVM中的PC寄存器是线程私有的每个线程都有自己的程序计数器它的生命周期与线程的生命周期保持一致。PC寄存器是程序控制流的指示灯分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 。 5.LR寄存器 在ARM架构中LRLink Register是一个特殊的寄存器其主要作用是存储子程序调用的返回地址。当执行函数调用指令如BLBranch and Link时LR寄存器会被自动设置为当前指令的下一条指令地址即返回地址。这样在函数执行完毕后可以通过将LR寄存器的值复制到程序计数器PC来实现函数的返回通常使用的指令是 MOV PC, LR 或者 BX LR 。 LR寄存器在异常处理中也扮演着重要角色。当异常发生时异常模式的LR用来保存异常返回地址即将当前的PC值保存到LR中以便在异常处理程序结束后能够通过LR寄存器恢复执行流回到异常发生前的状态。 ARM处理器针对不同的模式共有6个链接寄存器资源其中用户模式和系统模式共用一个LR每种异常模式都有各自专用的R14寄存器LR。这些链接寄存器分别为R14、R14_svc、R14_abt、R14_und、R14_irq、R14_fiq。程序设计者需要清晰地了解处理器的模式与相应寄存器的对应关系因为不同模式下的R14不是同一个物理资源其内容可能截然不同。 在ARMv8架构中LR寄存器的功能被X30寄存器所取代。在ARM64模式下X30用作链接寄存器存储子程序调用的返回地址。
http://www.hkea.cn/news/14291498/

相关文章:

  • 网站建设价格兴田德润i网址多少最新网站开发需求文档
  • 口碑好的坪山网站建设哈尔滨网站建设的公司
  • 国内 上市网站建设公司排名ppt免费下载的网站
  • 培训网站开发流程品牌网站建设c股j东大蝌蚪
  • 网站开发人员 怎么保存制作一个网站多少钱啊
  • yellow片观看完整版网站建设布局利于优化
  • python做网站快么昆山做网站的
  • 潍坊网络推广网站建设wordpress比特币插件
  • 织梦怎么做单页网站医院门户网站模板下载
  • 大良营销网站建设平台帮人家做网站难吗
  • saas建站平台源码有哪些做普洱茶网站的
  • 长沙企业建网站网站域名可以更换吗
  • 球迷类的网站如何做汕头网站推广
  • 网站的 规划与建设wordpress 门户网站源码
  • 手机做直播官方网站o2o最好的平台
  • 企业网站管理系统 才能湖南岚鸿简单房地产网站在哪
  • 远程教育网站建设方案asp.net网站登录
  • 企业内部网站模板下载做网站推荐源创网络
  • 学习网站建设的是什么专业谷歌优化 网站建设
  • 通过一个站点的建设方案十大免费excel网站
  • 网站页面设计的网址需要网站建设
  • 网站icp备案证明文件企业营销的目的
  • 如何做免费网站网站运营维护
  • 西安大兴医院网站建设wordpress插件 乱码
  • 太原市建设银行网站信息流推广
  • 兰州新区农投建设网站南通专业做网站公司
  • 网站建设 讲话网站后台构建
  • 农产品网站的品牌建设建网站拿到广告
  • 电子商务网站开发的任务书网络营销方法有什么
  • 受欢迎的合肥网站建设天河网站建设专家