NuttX 编译系统

2023-05-16

origin: http://blog.csdn.net/zhumaill/article/details/24400441
(嵌入式 实时操作系统 rtos nuttx 7.1 makefile)

NuttX 编译系统

转载请注明出处: http://blog.csdn.net/zhumaill/article/details/24400441

1  简介


NuttX 是通过 Makefile 文件组织编译的。Makefile 文件描述了整个 NuttX 工程的编译、链接等规则,告诉 make 要编译哪些文件、怎样编译以及在什么条件下编译。NuttX 没有使用 Autoconf、 Automake、 CMake、 SCons 等自动化编译工具,它的 Makefile 文件完全由手工编写,比那些自动化编译工具所使用的编译文件更容易阅读,更容易理解软件的编译过程。正应了那句话:试图用一种方法使事情变得简单,结果却使事情变得更复杂。

2  Makefile 文件组织结构

  • nuttx/Makefile: 顶层 Makefile 文件,内容很简单,根据主机环境,条件包含  Makefile.unix 或 Makefile.win。
  • nuttx/Makefile.unix:Linux 环境下的 Makefile 文件。
  • nuttx/Makefile.win:Windows 环境下的 Makefile 文件。
  • nuttx/Make.defs:从 nuttx/config/<板卡>/<目标配置>/Make.defs 复制而来。
  • 各级子目录下的 Makefile、 Make.defs 和 Make.dep。

3  Makefile 文件包含树


(顶层目录是 nuttx)
[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. `        |<--.config  
  2.          |  
  3.          |                 |<--.config  
  4.          |                 |<--tools/Config.mk  
  5.          |<--Makefile.unix-|  
  6. Makefile-|                 |             |<--.config  
  7.          |                 |<--Make.defs-|<--tools/Config.mk  
  8.          |                               |<--arch/arm/src/armv7-m/Toolchain.defs  
  9.          |  
  10.          |<--Makefile.win-(略)  
可以看出,《 nuttx 配置系统》中所生成的 .config 文件被包含在 Makefile 文件中。

各级子目录下的 Makefile、 Make.defs 和 Make.dep 并不是通过 include 包含的,而是在执行 Makefile 文件中的 make 命令时调用的。

4  构建目标和选项

4.1  构建目标:


以下是在顶层 Makefile 文件中可用的构建目标的概述:

all
    默认目标,按已选择的输出格式构建 NuttX 可执行文件。

clean
    移除派生对象文件、静态库文件、可执行文件和临时文件,但保留配置和上下文的文件和目录。还保留 Make.dep 文件。

distclean
    除了完成 “clean” 的工作之外,还包括移除所有配置和上下文的文件。本质是将目录结构还原为其原始的、未配置的状态。

4.2  应用程序内务处理目标


APPDIR 变量引用用户应用程序目录。如 NuttX 包含的 app/ 目录,然而,这不被看作是 NuttX 的一部分,可以被一个不同的应用程序目录替代。在大多数情况下,应用程序目录在 Makefile 脚本中被看作像任何其它构建目录。但是,为方便起见,包含了以下目标,以支持从 NuttX 构建目录处理用户应用程序目录中的内务处理功能。

apps_clean
    仅对用户应用程序目录执行 clean 操作。

apps_distclean
    仅对用户应用程序目录执行 distclean 操作。 apps/.config 文件被保留,所以这不是一个完全的 distclean,但多于配置复位。

export
    export 目标将打包 NuttX 库和头文件到可输出包。注意事项:(1) 需要对 KERNEL 构建做一些扩展。 (2) tools/mkexport.sh 中的逻辑只支持 GCC,例如,显式地假定静态库生成器为“ar”。

download
    这是一个助手目标,它将重建 NuttX 并将其下载到目标系统,只需一步。此目标的操作完全依赖于用户 Make.defs 文件中的 DOWNLOAD 命令的实现。如果未定义 DOWNLOAD 命令,它将产生一个错误。

4.3  内部目标


以下目标是由 make 逻辑内部使用的,但如果有必要,可以在某些条件下从命令行调用。

depend
    创建构建依赖关系,生成 Make.dep 文件和 .depend 文件。(注意:当前在使用 Windows 本地工具链的 Cygwin 下不支持构建依赖关系)

context
     在每次目标构建时调用 context 目标以确保正确配置了 NuttX。基本配置步骤包括在 include/nuttx 目录中创建 config.h 和 version.h 头文件,建立链接到配置目录的符号链接。

clean_context
    这是 distclean 目标的一部分。它移除由 context 目标创建的所有头文件和符号链接。

4.4  构建选项


当然,任何 make 变量的值都可以从命令行覆盖。然而,有一个特殊的变量赋值选项可能对你非常有用:

  V=1

这是生成详细级别标志。如果你在命令行上指定 V=1,你将在构建时看到所使用的确切命令。当添加新的板卡或追踪编译时错误和警告时可能非常有用。

5  all 目标依赖树

[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. `                          |<--pass1dep-|<----------------------------------------╮  
  2.              |<--pass1deps-|            |<--tools/mkdeps$(HOSTEXEEXT)             |  
  3.              |     |       |                                                      |  
  4.              |  ╭--╯       |<--$(USERLIBS)(平面构建时为空)                          |  
  5.              |  |                                                                 |  
  6.              |  |           |<--pass2dep-|<---------------------------------------|  
  7.              |<---pass2deps-|            |<--tools/mkdeps$(HOSTEXEEXT)            |  
  8.              |  |  |        |                                                     |  
  9.              |  |  |        |<--$(NUTTXLIBS)(与配置有关)<--╮                       |  
  10.              |  |  |                                      |                       |  
  11.              |  |  |  ╭-----------------------------------╯                       |  
  12.              |  |  |  |                                                           |  
  13.              |  |  |  |<--lib/libsched$(LIBEXT)<--sched/libsched$(LIBEXT)<--------|  
  14.              |  |  |  |<--lib/libc$(LIBEXT)<--libc/libc$(LIBEXT)<-----------------|  
  15.              |  |  |  |<--lib/libmm$(LIBEXT)<--mm/libmm$(LIBEXT)<-----------------|  
  16. all<--$(BIN)-|  |  |  |<--lib/libarch$(LIBEXT)<--$(ARCH_SRC)/libarch$(LIBEXT)<----|  
  17.              |  |  |  |<--lib/libcxx$(LIBEXT)<--libxx/libcxx$(LIBEXT)<------------|  
  18.              |  |  |  |<--lib/libapps$(LIBEXT)<--$(APPDIR)/libapps$(LIBEXT)<------|  
  19.              |  |  |  |<--lib/libnet$(LIBEXT)<--net/libnet$(LIBEXT)<--------------|  
  20.              |  |  |  |<--lib/libfs$(LIBEXT)<--fs/libfs$(LIBEXT)<-----------------|  
  21.              |  |  |  |<--lib/libdrivers$(LIBEXT)<--drivers/libdrivers$(LIBEXT)<--|  
  22.              |  |  |  |<--lib/libbinfmt$(LIBEXT)<--binfmt/libbinfmt$(LIBEXT)<-----|  
  23.              |  |  |                                                              |  
  24.              |  |  ╰---------╮                                                    |  
  25.              |  |            |                                                    |  
  26.              |  ╰--------╮   |                                                    |  
  27.              |           |   |                                                    |  
  28.              |<--pass1<--╯   |                                                    |  
  29.              |               |                                                    |  
  30.              |<--pass2<------╯                                                    |  
  31.                                                                                   |  
  32.       ╭---------------------------------------------------------------------------╯  
  33.       |  
  34.       |           |<--check_context  
  35.       |           |  
  36.       |           |<--include/nuttx/config.h-|<--$(TOPDIR)/.config  
  37.       |           |                          |<--tools/mkconfig$(HOSTEXEEXT)  
  38.       |           |  
  39.       |           |<--include/nuttx/version.h-|<--$(TOPDIR)/.version  
  40.       |           |                           |<--tools/mkversion$(HOSTEXEEXT)  
  41.       |           |  
  42.       |<--context-|<--include/math.h<--include/nuttx/math.h  
  43.                   |<--include/float.h<--include/nuttx/float.h  
  44.                   |<--include/stdarg.h<--include/nuttx/stdarg.h  
  45.                   |  
  46.                   |            |<--include/arch<-Make.defs  
  47.                   |            |  
  48.                   |            |<--include/arch/board-|<--include/arch<--Make.defs  
  49.                   |            |                      |<--Make.defs  
  50.                   |            |  
  51.                   |<--dirlinks-|<--include/arch/chip-|<--include/arch<--Make.defs  
  52.                                |                     |<--Make.defs  
  53.                                |  
  54.                                |<--$(ARCH_SRC)/board<--Make.defs  
  55.                                |<--$(ARCH_SRC)/chip<--Make.defs  
  56.                                |<--include/apps<--Make.defs  

6  all 目标编译过程

6.1  context 目标


因为 all 目标是默认目标,所以执行无参数的 make 命令即为编译 all 目标,首先会尝试编译 context 目标,其中,根据 .config 文件生成 config.h,有许多 C 文件包含了 config.h,以获得用户配置。注意其中的2个目录软链接,下文会用到:

$(ARCH_SRC)/board:
    将 nuttx/configs/shenzhou/src 目录链接到 nuttx/arch/arm/src/board 目录。

$(ARCH_SRC)/chip:
    将 nuttx/arch/arm/src/stm32 目录链接到 nuttx/arch/arm/src/chip 目录。

但是因为在安装 buildroot 时已经执行过一次 make context,而且执行 make clean 也不会删除 context 目标所生成的文件,所以这一步没做任何事。

6.2  pass1dep 目标

[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. pass1dep: context tools/mkdeps$(HOSTEXEEXT)  
  2.         $(Q) for dir in $(USERDEPDIRS) ; do \  
  3.                 $(MAKE) -C $$dir TOPDIR="$(TOPDIR)" depend ; \  
  4.         done  
平面构建是指将 NuttX 编译成单个二进制文件,构建的所有组件位于相同的地址空间,所有组件都可以访问所有其它组件。平面构建时 $(USERDEPDIRS) 为空,它也没做任何事。

6.3  $(USERLIBS) 目标


平面构建时 $(USERLIBS) 为空,它也没做任何事。这样整个 pass1deps 目标就完成了。

6.4  pass2dep 目标

[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. pass2dep: context tools/mkdeps$(HOSTEXEEXT)  
  2.         $(Q) for dir in $(KERNDEPDIRS) ; do \  
  3.                 $(MAKE) -C $$dir TOPDIR="$(TOPDIR)" EXTRADEFINES=$(KDEFINE) depend; \  
  4.         done  
根据 $(KERNDEPDIRS) 变量的值,在各级子目录下生成 Make.dep 和 .depend文件。

nuttx 目录下生成 Make.dep 和 .depend 文件的子目录有:
  • nuttx/arch/arm/src
  • nuttx/binfmt
  • nuttx/configs/shenzhou/src
  • nuttx/drivers
  • nuttx/fs
  • nuttx/libc
  • nuttx/libxx
  • nuttx/mm
  • nuttx/net
  • nuttx/sched

6.5  $(NUTTXLIBS) 目标


接下来就编译 pass2deps 目标中的 $(NUTTXLIBS),这是一个多目标,根据配置的不同,具体的目标也不同。它的工作是生成多个静态库文件。这里生成了10个静态库文件:
  • nuttx/lib/libapps.a
  • nuttx/lib/libarch.a
  • nuttx/lib/libbinfmt.a
  • nuttx/lib/libc.a
  • nuttx/lib/libcxx.a
  • nuttx/lib/libdrivers.a
  • nuttx/lib/libfs.a
  • nuttx/lib/libmm.a
  • nuttx/lib/libnet.a
  • nuttx/lib/libsched.a
下面以 libarch.a 为例,考查静态库的编译过程。
[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. $(ARCH_SRC)/libarch$(LIBEXT): context  
  2.         $(Q) $(MAKE) -C $(ARCH_SRC) TOPDIR="$(TOPDIR)" libarch$(LIBEXT)  
其中: $(ARCH_SRC) = nuttx/arch/arm/src,$(LIBEXT) = .a。传递的不是变量名,而是变量中的值。第2行的意思是先切换到目录 nuttx/arch/arm/src,再执行 make 命令,传递参数 TOPDIR,编译目标 libarch.a,这里的 make 调用的是目录 nuttx/arch/arm/src 中的 Makefile,编译的是该 Makefile 中的目标。在 nuttx/arch/arm/src/Makefile 中先定义 BIN = libarch$(LIBEXT),然后:
[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. $(BIN) $(KBIN): $(OBJS)  
  2.         $(call ARCHIVE, $@, $(OBJS))  
其中:OBJS = $(AOBJS) $(COBJS),而
AOBJS = $(ASRCS:.S=$(OBJEXT))
ASRCS = $(CHIP_ASRCS) $(CMN_ASRCS)

COBJS = $(CSRCS:.c=$(OBJEXT))
CSRCS = $(CHIP_CSRCS) $(CMN_CSRCS)

nuttx/arch/arm/src/Makefile 包含了 nuttx/arch/arm/src/chip/Make.defs,4个变量 CHIP_ASRCS、 CMN_ASRCS、 CHIP_CSRCS、 CMN_CSRCS 都是在 nuttx/arch/arm/src/chip/Make.defs 中定义的,多次赋值后的变量值如下:

CHIP_ASRCS = (空)

CMN_ASRCS = up_saveusercontext.S up_fullcontextrestore.S up_switchcontext.S vfork.S

CHIP_CSRCS = stm32_allocateheap.c stm32_start.c stm32_rcc.c stm32_lse.c stm32_lsi.c stm32_gpio.c stm32_exti_gpio.c stm32_flash.c stm32_irq.c stm32_timerisr.c stm32_dma.c stm32_lowputc.c stm32_serial.c stm32_spi.c stm32_sdio.c stm32_tim.c stm32_waste.c stm32_ccm.c stm32_i2c.c stm32_idle.c stm32_pmstop.c stm32_pmstandby.c stm32_pmsleep.c stm32_pminitialize.c stm32_eth.c stm32_pwr.c stm32_rtc.c

CMN_CSRCS = up_assert.c up_blocktask.c up_copyfullstate.c up_createstack.c up_mdelay.c up_udelay.c up_exit.c up_initialize.c up_initialstate.c up_interruptcontext.c up_memfault.c up_modifyreg8.c up_modifyreg16.c up_modifyreg32.c up_releasepending.c up_releasestack.c up_reprioritizertr.c up_schedulesigaction.c up_sigdeliver.c up_systemreset.c up_unblocktask.c up_usestack.c up_doirq.c up_hardfault.c up_svcall.c up_vfork.c

从这里可以查到哪些源文件被编译,哪些源文件没有被编译。

命令 $(call ARCHIVE, $@, $(OBJS)) 打包静态库 libarch.a。

现在回到nuttx/Makefile.unix:
[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. lib/libarch$(LIBEXT): $(ARCH_SRC)/libarch$(LIBEXT)  
  2.         $(Q) install $(ARCH_SRC)/libarch$(LIBEXT) lib/libarch$(LIBEXT)  
其中: install 是 Linux 命令,这里等同于复制,将 libarch.a 复制到 nuttx/lib 目录。

6.6  pass1 目标

[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. pass1: pass1deps  
  2. ifeq ($(CONFIG_BUILD_2PASS),y)  
  3.         $(Q) if [ -z "$(CONFIG_PASS1_BUILDIR)" ]; then \  
  4.                 echo "ERROR: CONFIG_PASS1_BUILDIR not defined"; \  
  5.                 exit 1; \  
  6.         fi  
  7.         $(Q) if [ ! -d "$(CONFIG_PASS1_BUILDIR)" ]; then \  
  8.                 echo "ERROR: CONFIG_PASS1_BUILDIR does not exist"; \  
  9.                 exit 1; \  
  10.         fi  
  11.         $(Q) if [ ! -f "$(CONFIG_PASS1_BUILDIR)/Makefile" ]; then \  
  12.                 echo "ERROR: No Makefile in CONFIG_PASS1_BUILDIR"; \  
  13.                 exit 1; \  
  14.         fi  
  15.         $(Q) $(MAKE) -C $(CONFIG_PASS1_BUILDIR) TOPDIR="$(TOPDIR)" LINKLIBS="$(LINKLIBS)" USERLIBS="$(USERLIBS)" "$(CONFIG_PASS1_TARGET)"  
  16. endif  
平面构建时不做任何事。

6.7  pass2 目标


最后编译pass2
[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. pass2: pass2deps  
  2.         $(Q) $(MAKE) -C $(ARCH_SRC) TOPDIR="$(TOPDIR)" EXTRA_OBJS="$(EXTRA_OBJS)" LINKLIBS="$(LINKLIBS)" EXTRADEFINES=$(KDEFINE) $(BIN)  
  3.         $(Q) if [ -w /tftpboot ] ; then \  
  4.                 cp -f $(BIN) /tftpboot/$(BIN).${CONFIG_ARCH}; \  
  5.         fi  
  6. ifeq ($(CONFIG_RRLOAD_BINARY),y)  
  7.         @echo "MK: $(BIN).rr"  
  8.         $(Q) $(TOPDIR)/tools/mkimage.sh --Prefix $(CROSSDEV) $(BIN) $(BIN).rr  
  9.         $(Q) if [ -w /tftpboot ] ; then \  
  10.                 cp -f $(BIN).rr /tftpboot/$(BIN).rr.$(CONFIG_ARCH); \  
  11.         fi  
  12. endif  
  13. ifeq ($(CONFIG_INTELHEX_BINARY),y)  
  14.         @echo "CP: $(BIN).hex"  
  15.         $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O ihex $(BIN) $(BIN).hex  
  16. endif  
  17. ifeq ($(CONFIG_MOTOROLA_SREC),y)  
  18.         @echo "CP: $(BIN).srec"  
  19.         $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O srec $(BIN) $(BIN).srec  
  20. endif  
  21. ifeq ($(CONFIG_RAW_BINARY),y)  
  22.         @echo "CP: $(BIN).bin"  
  23.         $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O binary $(BIN) $(BIN).bin  
  24. endif  
  25.         @echo "DUMP: $(BIN).out"  
  26.         $(Q) $(OBJDUMP) -x $(BIN) > $(HOME)/$(BIN).out  
  27.         @echo "DUMP: $(BIN).S"  
  28.         $(Q) $(OBJDUMP) -d -j .text -j .init_section -j .ARM.exidx -j .data -j .bss $(BIN) > $(HOME)/$(BIN).S  
  29.         cp -f $(BIN) $(BIN).hex $(BIN).bin $(HOME)  
把静态库链接成 elf 格式的可执行文件,并转换成 .hex、 .bin 等其它格式的文件。最后5行是我加上去的,生成符号文件、反汇编文件,并把一些最终文件复制到 Linux 用户主目录。由《 NuttX 安装脚本》中的以下几行实现:
[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if !(grep -q '    @echo "DUMP: $(BIN).out"' Makefile.unix); then  
  2.   sed -i '/pass2:/,/^$/{  
  3.     /^$/i\    @echo "DUMP: $(BIN).out"  
  4.     /^$/i\    $(Q) $(OBJDUMP) -x $(BIN) > $(HOME)/$(BIN).out  
  5.     /^$/i\    @echo "DUMP: $(BIN).S"  
  6.     /^$/i\    $(Q) $(OBJDUMP) -d -j .text -j .init_section -j .ARM.exidx -j .data -j .bss $(BIN) > $(HOME)/$(BIN).S  
  7.     /^$/i\    cp -f $(BIN) $(BIN).hex $(BIN).bin $(HOME)  
  8.   }' Makefile.unix  
  9. fi  

7  nuttx/Make.defs 文件


nuttx/Make.defs 文件是 Makefile 片断,从 nuttx/config/<板卡>/<目标配置>/Make.defs 复制而来。由《 NuttX 安装脚本》中的以下几行实现:
[ruby] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. echo "nuttx配置"  
  2. cd $BASEDIR/$TOPDIR/nuttx/tools  
  3. ./configure.sh $TARGETCONFIG  
该 Makefile 片断提供架构和工具特定的构建选项。它将在构建时被所有其它 Makefile 文件包含(一旦它被安装)。该 makefile 片断应定义:
  •     工具: CC、 LD、 AR、 NM、 OBJCOPY、 OBJDUMP
  •     工具选项: CFLAGS、 LDFLAGS
当该 Makefile 片断运行时,它将被传递构建根目录的路径 TOPDIR。该 Makefile 片断应包含:

    $(TOPDIR)/.config: Nuttx 配置
    $(TOPDIR)/tools/Config.mk: 一般定义

nuttx/Make.defs 文件中的定义可能依赖于 .config 文件中的一些设置。例如,如果 CONFIG_DEBUG=y, CFLAGS将最有可能不同。

tools/Config.mk 文件包含额外的定义,这些定义可能在必要时被架构特定的 Make.defs 文件覆盖:
    COMPILE、 ASSEMBLE、 ARCHIVE、 CLEAN 和 MKDEP 宏

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NuttX 编译系统 的相关文章

  • ulimit -s 指定栈上的内存上限

    转自 xff1a http blog chinaunix net uid 24439730 id 144094 html ulimit s 指定栈上的内存上限 xff0c 单位为KB xff0c 如 xff1a root 64 wdqf1w
  • C++头文件重复包含问题

    为了避免同一个文件被include多次 有两种方式 1 span class token macro property span class token directive keyword ifdef span SOMEFILE H spa
  • TCP(select函数模型)

    客户端代码 include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt arpa inet h gt include lt st
  • i2c那些坑

    origin http bbs ntpcb com simple t126695 html I2C 的那些坑 一般情况下 xff0c i2c 设备焊接没什么问题 xff0c 按照设备手册一步步来 xff0c 基本上就顺风顺水能够用起来 如果
  • stm32f103系列引脚定义-功能图

    器件功能和配置 STM32F103xx增强型 STM32F103xx增强型模块框架图 STM32F103xx增强型VFQFPN36管脚图 STM32F103xx增强型LQFP100管脚图 STM32F103xx增强型LQFP64管脚图 ST
  • 用数百行代码实现60亿设备互联:微软重金收购的ThreadX硬在何处

    origin https www sohu com a 315222502 485057 2019年4月 xff0c 微软收购了ThreadX的母公司Express Logic 公司 而ThreadX有几亿个设备在运行 1 物联网操作系统简
  • Cache和DMA一致性

    cache读必须要buffer是cacheline对齐的 DMA应该多多少少知道点吧 DMA Direct Memory Access 是指在外接可以不用CPU干预 xff0c 直接把数据传输到内存的技术 这个过程中可以把CPU解放出来 x
  • stm32几种低功耗模式的实现和差别

    origin https blog csdn net jian3214 article details 99818603 01 前言 按功耗由高到低排列 xff0c STM32具有运行 睡眠 停止和待机四种工作模式 上电复位后 STM32
  • threadx也开源了

    前一段时间ucos开源了 xff0c 今天微软收购的threadx也开源了 xff0c 行业剧变呀 xff01 xff01 xff01 2020 5 26
  • armv8-M 32bit处理器

    https www eet china com mp a14579 html https developer arm com ip products processors cortex m 最早的Cortex M0属于Armv6 M架构 x
  • 作为ARM Cortex-M家族的继承者 Cortex-M23与M33有哪五大特色?

    http news eeworld com cn xfdz article 2017011259937 html 集微网消息 xff0c ARM处理器在嵌入式设备领域的应用非常广泛 基于ARM Cortex处理器的片上系统 xff08 So
  • emmc5.1, ufs2.0, ufs3.0

    总的来说 xff0c UFS3 0的综合性能 xff0c 特别是持续读写速度有着秒杀UFS2 1前辈的表现 xff0c 只是在随机读写和SQLite性能上 xff0c 却依旧和双通道的UFS2 1持平 xff0c 有些小遗憾 最后 xff0
  • 串行Norflash是如何实现XIP的?

    先说问题 xff1a 要想程序在串行的Norflash中运行 xff0c 到底需要做哪些工作 xff1f Norflash和Nandflash想必大家都知道 恕本人才学疏浅 xff0c 最近突然发现Norflash可以并行连接实现XIP x
  • ARM汇编语言 - 简介 [一]

    origin https zhuanlan zhihu com p 82490125 ARM汇编语言 简介 一 兰新宇 talk is cheap 说明 xff1a 本系列文章将主要以ARMv7和ARMv8架构为例 xff0c 介绍ARM汇
  • ARM汇编语言 - 简介 [二]

    上文介绍了ARM的数据传送指令 xff0c 本文将主要介绍ARM中的移位 序转和位操作等数据处理指令 移位指令 移位包括逻辑移位和算术移位 xff0c 所谓 逻辑 就是将寄存器中存放的内容仅仅视为一串bits xff0c 移位的时候只需要将
  • 智能小车开发的重点之一电机该如何选型

    一 智能小车的分类 二 电机的分类 无刷电机要好于有刷电机 xff0c 优点 xff1a 1 没有损耗 xff0c 有刷电机有寿命 2 静音 xff0c 有刷电机噪音比较大 无刷电机分为带霍尔传感器和不带霍尔传感器两种 xff0c 因为无刷
  • ARM汇编语言 - 简介 [三]

    上文介绍了ARM的数据处理指令 xff0c 本文将主要介绍ARM中的跳转指令 跳转指令 无条件跳转 ARM中的基础跳转指令就一个字母 34 B 34 xff0c 代表Branch xff0c 相比起x86中和它功能基本相同的 34 jmp
  • CAN总线35周年特别篇 -- CAN总线的前世今生

    origin https mp weixin qq com s MloRz 4sio8QGdNItNRBjQ CAN总线35周年之际 xff0c 花了一晚上时间整理翻译了下 xff0c 通过这个帖子大家会对当前市场上各种CAN名词有的全面系
  • 微控制器CPU性能测试基准CoreMark

    origin https www cnblogs com henjay724 p 8729364 html 痞子衡嵌入式 xff1a 微控制器CPU性能测试基准 EEMBC CoreMark 大家好 xff0c 我是痞子衡 xff0c 是正
  • 意外发现,Cortex-M7的性能和诸多关键参数碾压A7和R7

    origin https www amobbs com thread 5676525 1 1 html 之前一直以为ARM A R M M排在最后也最便宜 xff0c 肯定性能最低 xff0c 但最近意外发现并非如此 xff0c M7居然完

随机推荐

  • gcc之-fomit-frame-point

    Kernel里的dump stack oops打印出来的backstrace调用链表是怎样实现的呢 xff1f 大家都知道当发生函数调用的时候 xff0c 函数的参数传递 xff0c 返回值传递都要遵循一定的规则 xff0c 在ARM体系架
  • Lauterbach trace32与 jlink

    一直不太明白trace32为何这么贵 xff0c 这篇文章讲了一些 xff0c 稍微明白一点了 一个小工具背后的故事 昨天我们推送了华为任正非2012年的讲话稿 真正的出路 xff1a 重读任正非2012实验室讲话 任总是在商场上真刀真枪干
  • 嵌入式开发输出调试信息的几种方法(常规法及非常规法)!

    origin https mp weixin qq com s 7LolqWUeJ4tCENh6yVmvXw 嵌入式开发的一个特点是很多时候没有操作系统 xff0c 或者没有文件系统 xff0c 常规的打印log到文件的方法基本不适用 最常
  • 从零开始,耗时两年,19岁小伙自制一块32位Risc-V处理器,可玩「贪吃蛇」

    从零开始 xff0c 耗时两年 xff0c 19岁小伙自制一块32位Risc V处理器 xff0c 可玩 贪吃蛇 脚本之家 今天 关注 脚本之家 xff0c 与百万开发者在一起 本文经机器之心 xff08 微信公众号 xff1a almos
  • 揭秘被Arm编译器所隐藏的浮点运算~

    以下文章来源于Mculover666 xff0c 作者mculover666 引言 笔者接触嵌入式领域软件开发以来 xff0c 几乎用的都是 ARM Cortex M 内核系列的微控制器 感谢C语言编译器的存在 xff0c 让我不用接触汇编
  • main之前初始化流程

    本文分别介绍Keil调用的ARMCC以及ARM NONE EABI GCC两个编译器在main之前的操作 xff1a Keil MDK启动文件 总结一下MDK的启动流程 xff1a 1 系统初始化 xff0c 包括中断向量表的重新映射 2
  • 嵌入式单片机之STM32F103C8T6最小系统板电路设计参考

    STM32F103C8T6最小系统板电路设计 一 电源部分 设计了一个XH插座 xff0c 以便使用3 7V锂电池供电 xff0c 接入电压不允许超过6V 二 指示灯部分 电源指示灯可以通过一个短路帽控制亮灭 xff0c 以达到节电的目的
  • 国产射频前端,攀登新高峰

    2022年 xff0c 国产射频前端开启新篇章 射频前端包括功率放大器 xff08 PA xff09 滤波器 xff08 Filter xff09 开关 xff08 Switch xff09 低噪声放大器 xff08 LNA xff09 天
  • slam相关文章

    1 视觉SLAM漫谈 http www cnblogs com gaoxiang12 p 3695962 html 2 学习SLAM需要哪些预备知识 xff1f https www zhihu com question 35186064 3
  • 工业机器人主要核心

    主要核心为三部分 xff0c 控制器 xff08 就是用来控制机器人动作的那个手持设备 xff0c 可以用来编程 xff0c 一般用vxworks和linux xff0c wince来实现 xff09 伺服电机和减速器用来实现机器人的动作
  • 想搞工业机器人 这五大方面你必须了解

    origin http www robot china com news 201510 09 25754 html 1 工业机器人控制系统硬件结构 控制器是 机器人 系统的核心 xff0c 国外有关公司对我国实行严密封锁 近年来随着微电子技
  • 为什么我选择并且推崇用ROS开发机器人?

    origin http www leiphone com news 201701 zBHXGJcsRTioj4gH html 雷锋网 公众号 xff1a 雷锋网 按 xff1a 本文来自知乎 xff0c 作者贾子枫 xff0c 雷锋网已获授
  • 一飞智控CEO齐俊桐:一篇文章教你看透无人机飞控这十年

    origin http www leiphone com news 201702 YO2bskI7smE1U8TA html 无人机 又一个被国人玩坏了的单词 科幻电影里的无人机 10年前说自己是搞无人机的 xff0c 无不引来疑惑和赞叹的
  • 机器人框架

    ROS Rock Yarp Orocos
  • 列王的纷争-深度传感器已被巨头瓜分?

    origin http mt sohu com 20170325 n484729546 shtml 我们常常说苹果富可敌国 但是你这么说其实是在侮辱苹果 苹果可比美国政府有钱多了 根据最新消息 xff0c 美国政府账上的现金 xff0c 只
  • 不得不看!国内深度摄像头方案大起底

    origin http pieeco baijia baidu com article 517947 引言 xff1a 市场对深度视觉技术需求趋于井喷 xff0c 但可以提供产品和方案的公司寥寥无几 xff0c 本文分析了国内三家各具特点的
  • VR中的9轴传感器(重力加速度/陀螺仪/磁力计)

    origin http blog csdn net dabenxiong666 article details 53836503 前言 传感器的调试过程 xff0c 一般根据原厂提供demo代码 xff0c 调试数据接口 xff0c 将数据
  • STM32中AD采样的三种方法分析

    在进行STM32F中AD采样的学习中 xff0c 我们知道AD采样的方法有多种 xff0c 按照逻辑程序处理有三种方式 xff0c 一种是查询模式 xff0c 一种是中断处理模式 xff0c 一种是DMA模式 三种方法按照处理复杂方法DMA
  • 神经网络:比原来更容易学习了

    origin http geek csdn net news detail 195039 原文 xff1a NEURAL NETWORKS YOU VE GOT IT SO EASY 作者 xff1a Steven Dufresne 翻译
  • NuttX 编译系统

    origin http blog csdn net zhumaill article details 24400441 xff08 嵌入式 实时操作系统 rtos nuttx 7 1 makefile xff09 NuttX 编译系统 转载