中国电子质量官网也就是一个死循环不清晰大师有没有思疑,为什么软件能限度硬件?反正当年我研习51的工夫,有这个思疑。即日咱们就暂停软件开辟,领会

  初学者,经常有一个狐疑,即是为什么软件能限度硬件?就像当年的51,为什么只须写P1=0X55,就可能正在IO口输出崎岖电平?要理清这个题目,先要了解一个观点:地方空间。

  什么是地方空间呢?所谓的地方空间,即是PC指针的寻址界限,于是也叫寻址空间。

  大师该当都清晰,咱们的电脑有32位体系和64位体系之分,为什么呢?由于32位体系,PC指针即是一个32位的二进造数,也即是0xffffffff,界限只要4G寻址空间。此刻内存越来越大,4G根蒂不敷,因而必要扩展,为了能拜望跨越4G界限的内存,就有了64位体系。STM32是众少位的?是32位的,于是PC指针也是32位,寻址空间也即是4G。

  咱们来看看STM32的寻址空间是若何样的。正在数据手册《STM32F407_数据手册.pdf》中有一个图,这个图,即是STM32的寻址空间分拨。全数的芯片,都邑有这个图,名字基础上都是叫Memory map,用一个新芯片,就先看这个图。

  最左边,8个block,每个block 512M,总共即是4G,也即是芯片的寻址空间。

  block 0 内里有一段叫做FLASH,也即是内部FLASH,咱们的标准即是下载到这个地方,肇始地方是0X800 0000,大师小心,这个只要1M空间。此刻STM32一经有2M flash的芯片了,跨越1M的FLASH放正在哪里呢?请自行查看对应的芯片手册。

  3 正在block 1 内,有两段SRAM,总共128K,这个空间,也即是咱们前面说的内存,存放标准利用的变量。若是必要,也可能把标准放到SRAM中运转。407不是有196K吗?

  原来407有196K内存,然则有64k并不是遍及的SRAM,而是放正在block 0 内的CCM。这两段区域不继续,并且,CCM只可内核利用,外设不行利用,比如DMA就不行用CCM内存,不然就死机。

  好的,咱们领会了寻址空间,咱们回过头看看,软件是奈何限度硬件的。正在IO口输出的例程中,咱们筑设IO口是挪用库函数,咱们看看库函数是若何做的。

  这个函数原来即是对一个变量赋值,对GPIOx这个布局体的成员BSRRL赋值。

  assert_param:这个是断言,用于判别输入参数是否相符哀求GPIOx是一个输入参数,是一个GPIO_TypeDef布局体指针,因而,要用->

  获取其成员

  到这里,咱们可能看出,操作IO口G,原来即是操作0X40000000+0X1800这个地方上的一个布局体内里的成员。说白了,即是操作了这个地方的寄存器。实际跟咱们操作遍及变量相同,就像下面的两句代码,区别即是变量i是SRAM空间地方,0X40000000+0X1800是外设空间地方。

  这个外设空间地方的寄存器是IO口硬件的一个人。如下图,左边的输出数据寄存器,即是咱们操作的寄存器(内存、变量),它的地方即是0X40000000+0X1800+0x14.

  限度其他外设也肖似,即是将数据写到外设寄存器上,跟操作内存相同,就可限度外设了。

  寄存器,原来该当是内存的统称,外设寄存器该当叫做特地寄存器。逐渐的,全数人都把外设的叫做寄存器,其他的统称内存或RAM。寄存器为什么能限度硬件外设呢?由于,大概的说,一个寄存器的一个BIT,即是一个开合,开即是1,合即是0。通过这个电子开合去限度电道,从而限度外设硬件。

  咱们一经完毕了串口和IO口的限度,然则咱们仅仅清晰了若何用,对其他全无所闻。标准若何跑的?代码事实放正在哪里?内存又是若何存在的?下面,咱们通过一个浅易的标准,研习嵌入式软件的基础因素。

  每个芯片都有复位成效,复位后,芯片的PC指针(一个寄存器,指示标准运转地方,合于众级流水线的芯片,PC能够跟真正施行的指令地方纷歧致,这里暂且以为一律)会复位到固定值,凡是是0x00000000,正在STM32中,复位到0X08000004。于是复位后运转的第一条代码即是0X08000004。前面咱们不是拷贝了一个启动代码文献到工程吗?startup_stm32f40_41xxx.s,这个汇编文献为什么叫启动代码?由于内里的汇编标准,即是复位之后施行的标准。正在文献中,有一段数据外,称为终了向量,内里存在了各个终了的施行地方。复位,也是一个终了。

  芯片复位时,芯片从终了外中将Reset_Handler这个值(函数指针)加载到PC指针,芯片就会施行Reset_Handler函数了。(一个函数入口即是一个指针)

  Reset_Handler函数,先施行SystemInit函数,这个函数正在准绳库内,主如果初始芯片时钟。然后跳到__main施行,__main函数是什么函数?

  芯片是若何清晰滥觞就施行启动代码的呢?或者说,咱们奈何把这个启动代码放到复位的地方?这就扳连到一个凡是环境下不体贴的文献wujique.sct,这个文献正在wujiqueprjObjects目次下,经常把这个文献叫做聚集加载文献,编译器械正在链接时,凭据这个文献睡觉各个代码段和变量。

  原来这个文献成效很庞大,通过点窜这个文献可能筑设标准的许众成效,比如:1 指定FLASH跟RAM的巨细于肇始地方,当咱们把标准分成BOOT、CORE、APP,乃至实行驱动涣散的工夫,就可能用上了。2 指定函数与变量的地方,比如把函数加载到RAM中运转。

  第7行 .o (RESET, +First)从0x08000000滥觞,先睡觉一个.o文献, 而且用(RESET, +First)指定RESET块优先睡觉,RESET块是什么?请查看启动代码,终了向量即是一个AREA,名字叫RESET,属于READONLY。如许编译后,RESET块将放正在0x08000000地方,也即是说,终了向量就放正在这个地方。DCD是分拨空间,4字节,第一个即是__initial_sp,第二个即是Reset_Handler函数指针。也即是说,末了编译后的标准,将Reset_Handler这个函数的指针(地方),放正在0x800000+4的地方。因而芯片正在复位的工夫,就能找到复位函数Reset_Handler。

  第9行 .ANY (+RO)有趣即是其他的全数RO,挨次往后放。即是说,其他代码,随着启动代码后面。

  第12行 .ANY (+RW +ZI)全数的RW ZI,全体放到RAM内里。RW,ZI,也即是变量,这一行指定了变量存在到什么地方。

  到此,基础启动经过一经领会完。下一步滥觞领会用户代码,就从main函数滥觞。1 标准跳转到main函数后:RCC_GetClocksFreq获取RCC时钟频率;SysTick_Config筑设SysTick,正在这里翻开了SysTick终了,10毫秒一次。

  2 初始化IO就不说了,进入while(1),也即是一个死轮回,嵌入式标准,都是一个死轮回,不然就跑飞了。

  3 正在while(1)中挪用TestFun函数,这个函数利用两个整体变量,两个个别变量。

  然后标准就不停正在main函数的while轮回内里施行。终了呢?对,又有终了。终了终了,即是终了平常的标准施行流程。咱们查看Delay函数,uwTimingDelay不等于0就死等?谁会将uwTimingDelay改为0?

  这个函数正在哪里施行?经查找,正在SysTick_Handler函数中运转。谁用这个函数?

  经查找,正在终了向量外中有这个函数,也即是说这个函数指针保保存终了向量外内。当发作终了时,就会施行这个函数。当然,正在进出终了会有存在和还原现场的操作。这个要紧涉及到汇编,暂且不实行领会了。有兴致己方咨询咨询。经常,此刻咱们开辟标准不必眷注上下文切换了。

  1 __main函数是什么函数?是咱们正在main.c中界说的main函数吗?2 聚集加载文献中*(InRoot$$Sections)是什么?3 ZI段,也即是初始化为0的数据段,什么工夫初始化?谁初始化?

  FromELF,创筑hex文献,FromELF是一个好器械,必要己方增添到option中技能用

  起首,是咱们己方的源码,这个标准咱们的代码不众,只要main.o,wujique_log.o,和其他极少STM32的库文献。

  第2个人是库内里的文献,看到没?内里有一个main.o。main函数是不是咱们写的main函数?分明不是,咱们的main函数是放正在main.o文献。这么小的一个工程,用了这么众库,你以前体贴过吗?臆度没有,除非你已经将一个蓝本正在1M flash上的标准压缩到能正在512K上运转。

  库文献是什么?库文献即是别人一经别写好的代码库。正在代码中,咱们时常会包蕴极少头文献,比如:

  这些即是库的头文献。这些头文献保保存MDK开辟器械的安设目次下。咱们时常用的库函数有:memcpy、memcmp、strcmp等。只须代码中包蕴了这些函数,就会链接库文献。

  再往上即是Image Symbol Table,就更进一步到每个函数或者变量的消息了

  TestTmp3数组放正在哪里?放正在0X080024E0这个地方,这但是代码区额。由于咱们用const装点了这个整体变量数组,告诉编译器,这个数组是不行能改观的,编译器就将这个数组存在到代码中了。标准中咱们时常会利用极少大数组数据,比如字符点阵,经常有几K几十K大,不行够也没须要放到RAM区,一切标准运转经过这些数据都不改观,于是通过const装点,将其存放到代码区。

  没找到test_tmp1/test_tmp2,为什么呢?正在界说时,test_tmp3加添了static界说,有趣即是静态个别变量,成效上,相当于整体变量,界说正在函数内,范围了这个整体变量只可正在这个函数内利用。那test_tmp1、test_tmp2放正在哪里呢?个别变量,正在编译链接时,并没有分拨空间,只要正在运转时,才从栈分拨空间。

  上一个人,咱们留了一个题目,哪些变量是RW,哪些是ZI?咱们看看串口变量的环境,UartBuf3放正在bss段,其他变量放正在.data段。为什么数组就放正在bss?bss是英文Block Started by Symbol的简称。

  RW Data,即是读写变量,比如整体变量跟static装点的个别变量。

  ZI Data,即是体系自愿初始化为0的读写变量,大个人是数组,放正在bss段。

  RW Size等于读写变量(网罗自愿初始化为0的),这个也即是RAM的巨细。

  ROM Size,也即是咱们编译之后的标的文献巨细,也即是FLASH的巨细。然则?为什么会包蕴RW Data呢?由于全数整体变量都必要一个初始化的值(就算没有真正初始化,体系也会分拨一个初始化空间),比如咱们界说一个变量u8 i = 8;如许的整体变量,8,这个值,就必要保保存FALSH区。

  咱们看看函数的环境,前面咱们不是有一个题目吗?__main和main是一个函数吗?查找main后展现,main是main,放正在0x08000579

  碰巧?参考PPT文档《ARM嵌入式软件开辟.ppt》,或自行GOOGLE。

  这一段代码都完毕什么成效呢?要紧完毕ZI代码的初始化,也即是将一个人RAM初始化为0。其他境况初始化。。。。经常,咱们不必管这一个人。

  到这里,一个标准,是若何构成的,标准是奈何运转的,基础有一个总体印象了。然而,合于终了,后面还会实行具体注解。

  著作由来:【微信号:玩转单片机与嵌入式,微信公家号:玩转单片机与嵌入式】接待增添体贴!著作转载请解释由来。

  咱们通过IO和串口的软件开辟,一经体验了嵌入式软件开辟。不清晰大师有没有思疑,为什么软件能限度

  次阅读 --

  的 /

  次阅读 --

  ? /

  次阅读 --

  计划,主营无线G发射吸取,WIFI,ZIGBEE,蓝牙),台灯和吸顶灯灯控,工控,汽车电子,智能家居。可供应

  次阅读 --

  次阅读 --

  次阅读 --

  咱们通过IO和串口的软件开辟,一经体验了嵌入式软件开辟。不清晰大师有没有思疑,为什么软件能限度

  次阅读 --

  次阅读 --

  咱们通过IO和串口的软件开辟,一经体验了嵌入式软件开辟。不清晰大师有没有思疑,为什么软件能限度

  次阅读 --

  标准的编译,运转 /

  咱们通过IO和串口的软件开辟,一经体验了嵌入式软件开辟。不清晰大师有没有思疑,为什么软件能限度

  次阅读 --

  ? /

  咱们通过IO和串口的软件开辟,一经体验了嵌入式软件开辟。不清晰大师有没有思疑,为什么软件能限度

  次阅读 --

  的? /

  次阅读 --

  的? /

  次阅读 --

  的? /

  ?就像当年的51,为什么只须写P1=0X55,就可能正在IO口输出崎岖电平?要理清这个题目,先要了解一个观点:地方空间。

  次阅读 --

  大师该当都清晰,咱们的电脑有32位体系和64位体系之分,为什么呢?由于32位体系,PC指针即是一个32位的二进造数,也即是0xffffffff,界限只要4G寻址空间。此刻内存越来越大,4G根蒂不敷,因而必要扩展,为了能拜望跨越4G界限的内存,就有了64位体系。

  次阅读 --

  的 /

  --

  【紫光同创盘古PGX-MINI-4K教程】——(盘古PGX-MINI-4K开辟板/PGC4KD-6ILPG144第五章)序列检测器尝试例程

转载请注明出处:MT4平台下载
本文标题网址:中国电子质量官网也就是一个死循环