STM32上电启动过程分析

嵌入式电子 2023-09-24 13:15

一、概述

1、说明

每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。

STM32作为一款高端 Cortex-M3系列单片机,有必要了解它的启动文件。打好基础,为以后优化程序,写出高质量的代码最准备。

本文以一个实际测试代码--START_TEST为例进行阐述。

2、整体过程概括

STM32整个启动过程是指从上电开始,一直到运行到 main函数之间的这段过程,步骤为(以使用微库为例):

①上电后硬件设置SP、PC

②设置系统时钟

③软件设置SP

④加载.data、.bss,并初始化栈区

⑤跳转到C文件的main函数

3、整个启动过程涉及的代码

推荐阅读👉深入理解MCU启动原理

启动过程涉及的文件不仅包含 startup_stm32f10x_hd.s,还涉及到了MDK自带的连接库文件 entry.o、entry2.o、entry5.o、entry7.o等(从生成的 map文件可以看出来)。

二、程序在Flash上的存储结构

在真正讲解启动过程之前,先要讲解程序下载到 Flash上的结构和程序运行时(执行到main函数)时的SRAM数据结构。程序在用户Flash上的结构如下图所示。下图是通过阅读hex文件和在MDK下调试综合提炼出来的。

  1. MSP初始值        编译器生成,主堆栈的初始值


  2. 异常向量表        不多说


  3. 外部中断向量表      不多说


  4. 代码段          存放代码


  5. 初始化数据段       .data


  6. 未初始化数据段      .bss

加载数据段和初始化栈的参数

加载数据段和初始化栈的参数分别有4个,这里只讲解加载数据段的参数,至于初始化栈的参数类似。

  1. 0x0800033c  Flash上的数据段(初始化数据段和未初始化数据段)起始地址


  2. 0x20000000  加载到SRAM上的目的地址


  3. 0x0000000c  数据段的总大小


  4. 0x080002f4  调用函数_scatterload_copy

需要说明的是初始化栈的函数-- 0x08000304与加载数据段的函数不一样,为 _scatterload_zeroinit,它的目的就是将栈空间清零。

三、数据在SRAM上的结构

程序运行时(执行到main函数)时的SRAM数据结构

四、详细过程分析

有了以上的基础,现在详细分析启动过程。

1、上电后硬件设置SP、PC

刚上电复位后,硬件会自动根据向量表偏移地址找到向量表,向量表偏移地址的定义如下:

调试现象如下:

看看我们的向量表内容(通过J-Flash打开hex文件)

硬件这时自动从0x0800 0000位置处读取数据赋给栈指针SP,然后自动从0x0800 0004位置处读取数据赋给PC,完成复位,结果为:

  1. SP = 0x02000810

  2. PC = 0x08000145

2、设置系统时钟

上一步中令 PC=0x08000145的地址没有对齐,硬件自动对齐到 0x08000144,执行 SystemInit函数初始化系统时钟。

3、软件设置SP

  1.   LDR R0,=__main

  2.   BX   R0

执行上两条之类,跳转到 __main程序段运行,注意不是main函数, ___main的地址是0x0800 0130。

可以看到指令LDR.W sp,[pc,#12],结果SP=0x2000 0810。

4、加载.data、.bss,并初始化栈区

  1. BL.W __scatterload_rt2

进入 __scatterload_rt2代码段。

  1. __scatterload_rt2:

  2. 0x080001684C06 LDR r4,[pc,#24] ; @0x08000184

  3. 0x0800016A4D07 LDR r5,[pc,#28] ; @0x08000188

  4. 0x0800016C E006 B 0x0800017C

  5. 0x0800016E68E0 LDR r0,[r4,#0x0C]

  6. 0x08000170 F0400301 ORR r3,r0,#0x01

  7. 0x08000174 E8940007 LDM r4,{r0-r2}

  8. 0x080001784798 BLX r3

  9. 0x0800017A3410 ADDS r4,r4,#0x10

  10. 0x0800017C42AC CMP r4,r5

  11. 0x0800017E D3F6 BCC 0x0800016E

  12. 0x08000180 F7FFFFDA BL.W _main_init (0x08000138)

这段代码是个循环 (BCC0x0800016e),实际运行时候循环了两次。第一次运行的时候,读取“加载数据段的函数 (_scatterload_copy)”的地址并跳转到该函数处运行(注意加载已初始化数据段和未初始化数据段用的是同一个函数);第二次运行的时候,读取“初始化栈的函数 (_scatterload_zeroinit)”的地址并跳转到该函数处运行。相应的代码如下:

  1. 0x0800016E68E0 LDR r0,[r4,#0x0C]

  2. 0x08000170 F0400301 ORR r3,r0,#0x01

  3. 0x08000174

  4. 0x080001784798 BLX r3

当然执行这两个函数的时候,还需要传入参数。至于参数,我们在“加载数据段和初始化栈的参数”环节已经阐述过了。当这两个函数都执行完后,结果就是“数据在SRAM上的结构”所展示的图。最后,也把事实加载和初始化的两个函数代码奉上如下:

  1. __scatterload_copy:

  2. 0x080002F4 E002 B 0x080002FC

  3. 0x080002F6 C808 LDM r0!,{r3}

  4. 0x080002F81F12 SUBS r2,r2,#4

  5. 0x080002FA C108 STM r1!,{r3}

  6. 0x080002FC2A00 CMP r2,#0x00

  7. 0x080002FE D1FA BNE 0x080002F6

  8. 0x080003004770 BX lr

  9. __scatterload_null:

  10. 0x080003024770 BX lr

  11. __scatterload_zeroinit:

  12. 0x080003042000 MOVS r0,#0x00

  13. 0x08000306 E001 B 0x0800030C

  14. 0x08000308 C101 STM r1!,{r0}

  15. 0x0800030A1F12 SUBS r2,r2,#4

  16. 0x0800030C2A00 CMP r2,#0x00

  17. 0x0800030E D1FB BNE 0x08000308

  18. 0x080003104770 BX lr

5、跳转到C文件的main函数

  1. _main_init:

  2. 0x080001384800 LDR r0,[pc,#0] ; @0x0800013C

  3. 0x0800013A4700 BX r0

五、异常向量与中断向量表

  1. ; VectorTableMapped to Address0 at Reset

  2. AREA RESET, DATA, READONLY

  3. EXPORT __Vectors

  4. EXPORT __Vectors_End

  5. EXPORT __Vectors_Size


  6. __Vectors DCD __initial_sp ; Top of Stack

  7. DCD Reset_Handler; ResetHandler

  8. DCD NMI_Handler ; NMI Handler

  9. DCD HardFault_Handler; HardFaultHandler

  10. DCD MemManage_Handler; MPU FaultHandler

  11. DCD BusFault_Handler; BusFaultHandler

  12. DCD UsageFault_Handler; UsageFaultHandler

  13. DCD 0; Reserved

  14. DCD 0; Reserved

  15. DCD 0; Reserved

  16. DCD 0; Reserved

  17. DCD SVC_Handler ; SVCallHandler

  18. DCD DebugMon_Handler; DebugMonitorHandler

  19. DCD 0; Reserved

  20. DCD PendSV_Handler; PendSVHandler

  21. DCD SysTick_Handler; SysTickHandler


  22. ; ExternalInterrupts

  23. DCD WWDG_IRQHandler ; WindowWatchdog

  24. DCD PVD_IRQHandler ; PVD through EXTI Line detect

  25. DCD TAMPER_IRQHandler ; Tamper

  26. DCD RTC_IRQHandler ; RTC

  27. DCD FLASH_IRQHandler ; Flash

  28. DCD RCC_IRQHandler ; RCC

  29. DCD EXTI0_IRQHandler ; EXTI Line0

  30. DCD EXTI1_IRQHandler ; EXTI Line1

  31. DCD EXTI2_IRQHandler ; EXTI Line2

  32. DCD EXTI3_IRQHandler ; EXTI Line3

  33. DCD EXTI4_IRQHandler ; EXTI Line4

  34. DCD DMA1_Channel1_IRQHandler ; DMA1 Channel1

  35. DCD DMA1_Channel2_IRQHandler ; DMA1 Channel2

  36. DCD DMA1_Channel3_IRQHandler ; DMA1 Channel3

  37. DCD DMA1_Channel4_IRQHandler ; DMA1 Channel4

  38. DCD DMA1_Channel5_IRQHandler ; DMA1 Channel5

  39. DCD DMA1_Channel6_IRQHandler ; DMA1 Channel6

  40. DCD DMA1_Channel7_IRQHandler ; DMA1 Channel7

  41. DCD ADC1_2_IRQHandler ; ADC1 & ADC2

  42. DCD USB_HP_CAN1_TX_IRQHandler ; USB HighPriority or CAN1 TX

  43. DCD USB_LP_CAN1_RX0_IRQHandler ; USB LowPriority or CAN1 RX0

  44. DCD CAN1_RX1_IRQHandler ; CAN1 RX1

  45. DCD CAN1_SCE_IRQHandler ; CAN1 SCE

  46. DCD EXTI9_5_IRQHandler ; EXTI Line9..5

  47. DCD TIM1_BRK_IRQHandler ; TIM1 Break

  48. DCD TIM1_UP_IRQHandler ; TIM1 Update

  49. DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation

  50. DCD TIM1_CC_IRQHandler ; TIM1 CaptureCompare

  51. DCD TIM2_IRQHandler ; TIM2

  52. DCD TIM3_IRQHandler ; TIM3

  53. DCD TIM4_IRQHandler ; TIM4

  54. DCD I2C1_EV_IRQHandler ; I2C1 Event

  55. DCD I2C1_ER_IRQHandler ; I2C1 Error

  56. DCD I2C2_EV_IRQHandler ; I2C2 Event

  57. DCD I2C2_ER_IRQHandler ; I2C2 Error

  58. DCD SPI1_IRQHandler ; SPI1

  59. DCD SPI2_IRQHandler ; SPI2

  60. DCD USART1_IRQHandler ; USART1

  61. DCD USART2_IRQHandler ; USART2

  62. DCD USART3_IRQHandler ; USART3

  63. DCD EXTI15_10_IRQHandler ; EXTI Line15..10

  64. DCD RTCAlarm_IRQHandler; RTC Alarm through EXTI Line

  65. DCD USBWakeUp_IRQHandler; USB Wakeup from suspend

  66. DCD TIM8_BRK_IRQHandler ; TIM8 Break

  67. DCD TIM8_UP_IRQHandler ; TIM8 Update

  68. DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation

  69. DCD TIM8_CC_IRQHandler ; TIM8 CaptureCompare

  70. DCD ADC3_IRQHandler ; ADC3

  71. DCD FSMC_IRQHandler ; FSMC

  72. DCD SDIO_IRQHandler ; SDIO

  73. DCD TIM5_IRQHandler ; TIM5

  74. DCD SPI3_IRQHandler ; SPI3

  75. DCD UART4_IRQHandler ; UART4

  76. DCD UART5_IRQHandler ; UART5

  77. DCD TIM6_IRQHandler ; TIM6

  78. DCD TIM7_IRQHandler ; TIM7

  79. DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1

  80. DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2

  81. DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3

  82. DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4& Channel5

  83. __Vectors_End

这段代码就是定义异常向量表,在之前有一个“J-Flash打开hex文件”的图片跟这个表格是一一对应的。编译器根据我们定义的函数 Reset_Handler、NMI_Handler等,在连接程序阶段将这个向量表填入这些函数的地址。

  1. startup_stm32f10x_hd.s内容:


  2. N MI_Handler PROC

  3. EXPORT NMI_Handler [WEAK]

  4. B .

  5. ENDP



  6. stm32f10x_it.c中内容:

  7. void NMI_Handler(void)

  8. {

  9. }

在启动汇编文件中已经定义了函数 NMI_Handler,但是使用了“弱”,它允许我们再重新定义一个 NMI_Handler函数,程序在编译的时候会将汇编文件中的弱函数“覆盖掉”--两个函数的代码在连接后都存在,只是在中断向量表中的地址填入的是我们重新定义函数的地址。

六、使用微库与不使用微库的区别

使用微库就意味着我们不想使用MDK提供的库函数,而想用自己定义的库函数,比如说printf函数。那么这一点是怎样实现的呢?我们以printf函数为例进行说明。

1、不使用微库而使用系统库

在连接程序时,肯定会把系统中包含printf函数的库拿来调用参与连接,即代码段有系统库的参与。

在启动过程中,不使用微库而使用系统库在初始化栈的时候,还需要初始化堆(猜测系统库需要用到堆),而使用微库则是不需要的。

  1. IF :DEF:__MICROLIB


  2. EXPORT __initial_sp

  3. EXPORT __heap_base

  4. EXPORT __heap_limit


  5. ELSE


  6. IMPORT __use_two_region_memory

  7. EXPORT __user_initial_stackheap


  8. __user_initial_stackheap


  9. LDR R0, = Heap_Mem

  10. LDR R1, =(Stack_Mem+ Stack_Size)

  11. LDR R2, = (Heap_Mem+ Heap_Size)

  12. LDR R3, = Stack_Mem

  13. BX LR


  14. ALIGN


  15. ENDIF

另外,在执行 __main函数的过程中,不仅需要完成“使用微库”情况下的所有工作,额外的工作还需要进行库的初始化,才能使用系统库(这一部分我还没有深入探讨)。附上 __main函数的内容:

  1. __main:

  2. 0x08000130 F000F802 BL.W __scatterload_rt2_thumb_only (0x08000138)

  3. 0x08000134 F000F83C BL.W __rt_entry_sh (0x080001B0)

  4. __scatterload_rt2_thumb_only:

  5. 0x08000138 A00A ADR r0,{pc}+4; @0x08000164

  6. 0x0800013A E8900C00 LDM r0,{r10-r11}

  7. 0x0800013E4482 ADD r10,r10,r0

  8. 0x080001404483 ADD r11,r11,r0

  9. 0x08000142 F1AA0701 SUB r7,r10,#0x01

  10. __scatterload_null:

  11. 0x0800014645DA CMP r10,r11

  12. 0x08000148 D101 BNE 0x0800014E

  13. 0x0800014A F000F831 BL.W __rt_entry_sh (0x080001B0)

  14. 0x0800014E F2AF0E09 ADR.W lr,{pc}-0x07; @0x08000147

  15. 0x08000152 E8BA000F LDM r10!,{r0-r3}

  16. 0x08000156 F0130F01 TST r3,#0x01

  17. 0x0800015A BF18 IT NE

  18. 0x0800015C1AFB SUBNE r3,r7,r3

  19. 0x0800015E F0430301 ORR r3,r3,#0x01

  20. 0x080001624718 BX r3

  21. 0x080001640298 LSLS r0,r3,#10

  22. 0x080001660000 MOVS r0,r0

  23. 0x0800016802B8 LSLS r0,r7,#10

  24. 0x0800016A0000 MOVS r0,r0

  25. __scatterload_copy:

  26. 0x0800016C3A10 SUBS r2,r2,#0x10

  27. 0x0800016E BF24 ITT CS

  28. 0x08000170 C878 LDMCS r0!,{r3-r6}

  29. 0x08000172 C178 STMCS r1!,{r3-r6}

  30. 0x08000174 D8FA BHI __scatterload_copy (0x0800016C)

  31. 0x080001760752 LSLS r2,r2,#29

  32. 0x08000178 BF24 ITT CS

  33. 0x0800017A C830 LDMCS r0!,{r4-r5}

  34. 0x0800017C C130 STMCS r1!,{r4-r5}

  35. 0x0800017E BF44 ITT MI

  36. 0x080001806804 LDRMI r4,[r0,#0x00]

  37. 0x08000182600C STRMI r4,[r1,#0x00]

  38. 0x080001844770 BX lr

  39. 0x080001860000 MOVS r0,r0

  40. __scatterload_zeroinit:

  41. 0x080001882300 MOVS r3,#0x00

  42. 0x0800018A2400 MOVS r4,#0x00

  43. 0x0800018C2500 MOVS r5,#0x00

  44. 0x0800018E2600 MOVS r6,#0x00

  45. 0x080001903A10 SUBS r2,r2,#0x10

  46. 0x08000192 BF28 IT CS

  47. 0x08000194 C178 STMCS r1!,{r3-r6}

  48. 0x08000196 D8FB BHI 0x08000190

  49. 0x080001980752 LSLS r2,r2,#29

  50. 0x0800019A BF28 IT CS

  51. 0x0800019C C130 STMCS r1!,{r4-r5}

  52. 0x0800019E BF48 IT MI

  53. 0x080001A0600B STRMI r3,[r1,#0x00]

  54. 0x080001A24770 BX lr

  55. __rt_lib_init:

  56. 0x080001A4 B51F PUSH {r0-r4,lr}

  57. 0x080001A6 F3AF8000 NOP.W

  58. __rt_lib_init_user_alloc_1:

  59. 0x080001AA BD1F POP {r0-r4,pc}

  60. __rt_lib_shutdown:

  61. 0x080001AC B510 PUSH {r4,lr}

  62. __rt_lib_shutdown_user_alloc_1:

  63. 0x080001AE BD10 POP {r4,pc}

  64. __rt_entry_sh:

  65. 0x080001B0 F000F82F BL.W __user_setup_stackheap (0x08000212)

  66. 0x080001B44611 MOV r1,r2

  67. __rt_entry_postsh_1:

  68. 0x080001B6 F7FFFFF5 BL.W __rt_lib_init (0x080001A4)

  69. __rt_entry_postli_1:

  70. 0x080001BA F000F919 BL.W main (0x080003F0)

2、使用微库而不使用系统库

在程序连接时,不会把包含printf函数的库连接到终极目标文件中,而使用我们定义的库。

启动时需要完成的工作就是之前论述的步骤1、2、3、4、5,相比使用系统库,启动过程步骤更少。


定期以通俗易懂的方式分享嵌入式知识,关注公众号,加星标,每天进步一点点。


声明:

本号原创、转载的文章、图片等版权归原作者所有,如有侵权,请联系删除。

关注、点赞、在看、转发,支持优质内容! 

评论
  • 国际标准IPC 标准:IPC-A-600:规定了印刷电路板制造过程中的质量要求和验收标准,涵盖材料、外观、尺寸、焊接、表面处理等方面。IPC-2221/2222:IPC-2221 提供了用于设计印刷电路板的一般原则和要求,IPC-2222 则针对高可靠性电子产品的设计提供了进一步的指导。IPC-6012:详细定义了刚性基板和柔性基板的要求,包括材料、工艺、尺寸、层次结构、特征等。IPC-4101:定义了印刷电路板的基板材料的物理和电气特性。IPC-7351:提供了元件封装的设计规范,包括封装尺寸
    Jeffreyzhang123 2025-01-02 16:50 198浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 155浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 157浏览
  • 影像质量应用于多个不同领域,无论是在娱乐、医疗或工业应用中,高质量的影像都是决策的关键基础。清晰的影像不仅能提升观看体验,还能保证关键细节的准确传达,例如:在医学影像中,它对诊断结果有着直接的影响!不仅如此,影像质量还影响了:▶ 压缩技术▶ 存储需求▶ 传输效率随着技术进步,影像质量的标准不断提高,对于研究与开发领域,理解并提升影像质量已成为不可忽视的重要课题。在图像处理的过程中,硬件与软件除了各自扮演着不可或缺的基础角色,有效地协作能够确保图像处理过程既高效又具有优异的质量。软硬件各扮演了什么
    百佳泰测试实验室 2025-01-03 10:39 132浏览
  • 从无到有:智能手机的早期探索无线电话装置的诞生:1902 年,美国人内森・斯塔布菲尔德在肯塔基州制成了第一个无线电话装置,这是人类对 “手机” 技术最早的探索。第一部移动手机问世:1938 年,美国贝尔实验室为美国军方制成了世界上第一部 “移动” 手机。民用手机的出现:1973 年 4 月 3 日,摩托罗拉工程师马丁・库珀在纽约曼哈顿街头手持世界上第一台民用手机摩托罗拉 DynaTAC 8000X 的原型机,给竞争对手 AT&T 公司的朋友打了一个电话。这款手机重 2 磅,通话时间仅能支持半小时
    Jeffreyzhang123 2025-01-02 16:41 167浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 117浏览
  • 【工程师故事】+半年的经历依然忧伤,带着焦虑和绝望  对于一个企业来说,赚钱才是第一位的,对于一个人来说,赚钱也是第一位的。因为企业要活下去,因为个人也要活下去。企业打不了倒闭。个人还是要吃饭的。企业倒闭了,打不了从头再来。个人失业了,面对的不仅是房贷车贷和教育,还有找工作的焦虑。企业说,一个公司倒闭了,说明不了什么,这是正常的一个现象。个人说,一个中年男人失业了,面对的压力太大了,焦虑会摧毁你的一切。企业说,是个公司倒闭了,也不是什么大的问题,只不过是这些公司经营有问题吧。
    curton 2025-01-02 23:08 286浏览
  • 前言近年来,随着汽车工业的快速发展,尤其是新能源汽车与智能汽车领域的崛起,汽车安全标准和认证要求日益严格,应用范围愈加广泛。ISO 26262和ISO 21448作为两个重要的汽车安全标准,它们在“系统安全”中扮演的角色各自不同,但又有一定交集。在智能网联汽车的高级辅助驾驶系统(ADAS)应用中,理解这两个标准的区别及其相互关系,对于保障车辆的安全性至关重要。ISO 26262:汽车功能安全的基石如图2.1所示,ISO 26262对“功能安全”的定义解释为:不存在由于电子/电气系统失效引起的危害
    广电计量 2025-01-02 17:18 218浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 160浏览
  • 在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。挂载镜像首先,将要修改内容的镜像传入虚拟机当中,并创建一个要挂载镜像的文件夹,如下图:之后通过挂载命令将system.img镜像挂载到sys
    Industio_触觉智能 2025-01-03 11:39 112浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 168浏览
  • Matter加持:新世代串流装置如何改变智能家居体验?随着现在智能家庭快速成长,串流装置(Streaming Device,以下简称Streaming Device)除了提供更卓越的影音体验,越来越多厂商开始推出支持Matter标准的串流产品,使其能作为智能家庭中枢,连结多种智能家电。消费者可以透过Matter的功能执行多样化功能,例如:开关灯、控制窗帘、对讲机开门,以及操作所有支持Matter的智能家电。此外,再搭配语音遥控器与语音助理,打造出一个更加智能、便捷的居家生活。支持Matter协议
    百佳泰测试实验室 2025-01-03 10:29 136浏览
  • 本文继续介绍Linux系统查看硬件配置及常用调试命令,方便开发者快速了解开发板硬件信息及进行相关调试。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。查看系统版本信息查看操作系统版本信息root@ido:/# cat /etc/*releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=20.04DISTRIB_CODENAME=focalDIS
    Industio_触觉智能 2025-01-03 11:37 137浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦