用GCC开发STM32,正点原子开发板的一个库函数版本例程示例

2023-11-14

GCC环境搭建.

首先下载交叉编译环境GCC,这个网上有很多,百度一下就能找到下载。比如 Sourcery G++ for ARM EABI

我的CSDN资源里,有相关下载。

熟悉下Makefile

强力推荐熟悉网络牛人李云的51cto博客,有一篇驾驭Makefile的文章,另外一份参考资料也尤为重要《GNUmake中文手册-v3.80.pdf》,这都是先辈们开凿好的前路,对于后辈的我们只要沿路走就可以了。

熟悉Makefile主要还是实践,按照李云博客介绍的方法,多使用echo,或者使用make的调试命令make –D > 1.txt,这样可以熟悉其中的依赖关系和建立顺序。说的直白点就是建立对应依赖关系。

在熟悉的时候,可以一边对照实际工程编写对应的Makefile。

以下是简要学习Makefile的笔记:

1. %.a: 匹配所有以.a结尾的所有文件名

   |--> 类似于通常意义的*.

2. $(addprefixsrc/,foo bar) -->

   返回值为"src/foosrc/bar"。

3. vpath %.h../headers

   Makefile中出现的.h文件:如果不能再当前目录中找到,则到目录"../headers"下寻找.

vpath与VPATH的区别在于后者指定全局的搜索路径

4. $(MAKE) -C$(STD_PERIPH_LIB)

   make的递归执行-->4.6GNUmake中文手册-v3.8

   当前目录下存在外设库文件,在编译的时候先对子目录进行编译.

   它等价于命令

   lib:

         cd $(STD_PERIPH_LIB) && $(MAKE)

5. $@:代表规则中的目标文件名:可以使用@-->at 代表目标的意思

   $%:规则的目标文件是一个静态库文件时,代表静态库的一个成员名.

   $<:规则的第一个依赖文件名.

   $^:规则的所有依赖文件列表.

   $(*D): 代表"茎"中的目录部分

   $(*F): 代表"茎"中的文件名部分

6. find ./ -name'*~' | xargs rm -f

   当你尝试用rm 删除太多的文件,你可能得到一个错误信息:

   /bin/rm Argument list too long. 用xargs 去避免这个问题

7. 将make调试信息保存到txt文档

   make -d > 1.txt

8. main.c 中#include"defs.h"

   命令 gcc -M main.c

   out: main.o:main.c defs.h

   若不需要依赖关系中不考虑标准头文件时

   使用gcc -MM main.c

9.  := 与 += 区别

   := --> 立即展开

   += --> 立即展开或延迟展开

   对于所有条件语句均采用立即展开

10. 将make输出的错误信息输出到文件1.txt

   make 2>1.txt

11. 从Shell获得当前文件夹位置

   ROOT=$(shell pwd)

12. 包含依赖文件时,不要放在所有目标的前面,如下所示


其中原因就是make依然会将dep文件作为目标,从而后面的目标无法得到运行。

四、熟悉gcc编译

Gcc编译学习是一个长期的过程,主要参考文档见安装目录下的Documation中的所有pdf和readme.txt。下面是简短的学习笔记。

1.      参数解释:

-g(level): 在本地操作系统产生指定格式的调试消息(stabs,COFF,XCOFF,DWARF 2)

-ggdb(level): 产生gdb格式的调试信息

-gstabs(level):产生stabs格式的调试信息,不包括GDB扩展.-->BSD.

  (level)-->默认级别为2

  0:不产生调试信息

  1:产生最少的调试信息

  3:包括额外的信息,包括在程序中出现的宏定义等.

  -gstabs+,-gcoff,-gxcoff,-gxcoff+,-gdwarf-version,-gvms

-c

   只激活预处理,编译和汇编,生成obj文件.还需要通过ld链接器对所有

   .o文件进行链接才能生成执行文件.

   -S

   只激活预处理和编译把文件汇编到汇编代码,相当于将程序生成.s文件.

   -E

   只进行预处理

   -o

   定制目标名称,缺省情况下生成a.out文件. gcc -ohello.exe test.c

   -D(macro)

   相当于#define  macro    1比如DDEBUG相当于将DEBUG的宏定义为1

   -C

   在预处理的时候不删除注释信息.

   -M

   生成文件的关联信息,就可以知道源代码依赖了那些头文件.

   -MM

   同上,忽略#include造成的依赖关系

   -MD

   和-M相当,但是输出导入到.d文件中. gcc -MDtest.c 输出依赖关系

   放在test.d文件里

   -MF file

   生成指定的默认依赖文件.

   -MMD

   和-MM相当,忽略#include造成的依赖关系

   -l(library)

   用于指定编译的时候使用的库. gcc-lgtk test.c 则程序使用gtk库进

   行编译.不过需要注意的是gcc库一般以lib(name).a来命名库文件,使用

   -l参数导入库文件的时候,直接使用-lname来引入,lib被省略.

   -L(dir)

   指定库文件所在的文件夹

   -T script

   指定空间分配文件



下面是编译 正点原子 stm32f103开发板的一个库函数版本的流水灯的例程的makefile,需要注意几点得是:

要把startup_stm32f10x_hd.s替换为gcc_ride7里面的startup_stm32f10x_hd.s,keil里面的汇编文件不能用于gcc

链接脚本文件也特别重要。要找能用于gcc下面的链接脚本根据需要修改。CSDN资源里有完整的编译通过的例子。把libc.a和libgcc.a拷贝出来放到工程的Lib文件夹里

#****************************************************************************
# Cross complie path
#****************************************************************************
PRJ := ${PWD}
GCC_PATH=c:\tools\arm2013.05


CROSS_COMPILE=$(GCC_PATH)\bin\arm-none-eabi-


CC     := $(CROSS_COMPILE)gcc
CXX    := $(CROSS_COMPILE)g++
AS   := $(CROSS_COMPILE)as
AR     := $(CROSS_COMPILE)ar rc
LD     := $(CROSS_COMPILE)ld
RANLIB := $(CROSS_COMPILE)ranlib
OBJDUMP:= $(CROSS_COMPILE)objdump
OBJCOPY:= $(CROSS_COMPILE)objcopy
STRIP  := $(CROSS_COMPILE)strip


BINARY = main


CFLAGS= -O0  -g -mcpu=cortex-m3 -mthumb -nostartfiles  -D STM32F10X_HD -D USE_STDPERIPH_DRIVER 
ASFLAG= -g -mcpu=cortex-m3 -mthumb 


LDSCRIPT = stm32f103VET6.ld
LDFLAGS =   -Llib -T $(LDSCRIPT) 


#****************************************************************************
# Targets of the build
#****************************************************************************
TARGET   := .\Output\A303_GJXF


all: prebuild $(TARGET).elf


SRC_C=$(shell gfind . -name "*.c")
SRC_S=$(shell gfind . -name "*.s")


OBJ_C=$(patsubst %.c, %.o, $(SRC_C))
OBJ_S=$(patsubst %.s, %.o, $(SRC_S))


OBJS := $(OBJ_C) $(OBJ_S)
#****************************************************************************
# Libs
#****************************************************************************
LIB_C         := $(GCC_PATH)\arm-none-eabi\lib\libc.a
LIB_GCC       := $(GCC_PATH)\lib\gcc\arm-none-eabi\4.7.3\libgcc.a
LIBS = $(LIB_C) $(LIB_GCC)
INCS = -I HARDWARE\LED -I SYSTEM\delay -I SYSTEM\sys -I SYSTEM\usart -I USER -I STM32F10x_FWLib\inc -I CORE  
# OBJS = stm32f10x_gpio.o stm32f10x_rcc.o isr.o


# OBJS += $(BINARY).o 
# OBJS += core_cm3.o
# OBJS += system_stm32f10x.o


#****************************************************************************
# TARGET
#****************************************************************************
prebuild:
@echo Building app...


$(TARGET).elf : $(OBJS) $(LIBS)
@echo (LD) $@: $^
-${LD}  -o $@ $^ ${LDFLAGS} 
@echo Generating bin...
@$(OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin
@echo Generating hex...
@$(OBJCOPY) -O ihex $@ $(TARGET).hex
@echo Generating asm...
@$(OBJDUMP) -D -S $@ > $(TARGET).asm
@echo OK!


%.o : %.c
${CC} -c ${CFLAGS} ${INCS} -o $@ $<


%.o : %.s
$(AS) $(ASFLAG) -o $@ $<


clean:
@echo The following files:
rm  -f  $(TARGET) *.o
gfind . -name "*.[od]" |xargs rm
@echo Removed!

#====================end

/*
Default linker script for STM32F10x_1024K_1024K
Copyright RAISONANCE S.A.S. 2008
*/


/* include the common STM32F10x sub-script */


/* Common part of the linker scripts for STM32 devices*/




/* default stack sizes. 


These are used by the startup in order to allocate stacks for the different modes.
*/


__Stack_Size = 512 ;


PROVIDE ( _Stack_Size = __Stack_Size ) ;


__Stack_Init = _estack  - __Stack_Size ;


/*"PROVIDE" allows to easily override these values from an object file or the commmand line.*/
PROVIDE ( _Stack_Init = __Stack_Init ) ;


/*
There will be a link error if there is not this amount of RAM free at the end.
*/
_Minimum_Stack_Size = 0x100 ;




/* include the memory spaces definitions sub-script */
/*
Linker subscript for STM32F10x definitions with 1024K Flash and 1024K External SRAM */


/* Memory Spaces Definitions */


MEMORY
{
  RAM (xrw) : ORIGIN = 0x60000000, LENGTH = 512K
  FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K
  FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
  EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
  EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
  EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
  EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
}


/* higher address of the user mode stack */
_estack = 0x60080000;






/* include the sections management sub-script for FLASH mode */


/* Sections Definitions */


SECTIONS
{
    /* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
    .isr_vector :
    {
        . = ALIGN(4);
        KEEP(*(.isr_vector))            /* Startup code */
        . = ALIGN(4);
    } >FLASH


    /* for some STRx devices, the beginning of the startup code is stored in the .flashtext section, which goes to FLASH */
    .flashtext :
    {
        . = ALIGN(4);
        *(.flashtext)            /* Startup code */
        . = ALIGN(4);
    } >FLASH


    
    /* the program code is stored in the .text section, which goes to Flash */
    .text :
    {
        . = ALIGN(4);
            
        *(.text)                   /* remaining code */
        *(.text.*)                   /* remaining code */
        *(.rodata)                 /* read-only data (constants) */
        *(.rodata*)
        *(.glue_7)
        *(.glue_7t)


        . = ALIGN(4);
         _etext = .;
        /* This is used by the startup in order to initialize the .data secion */
        _sidata = _etext;
    } >FLASH
    




    /* This is the initialized data section
    The program executes knowing that the data is in the RAM
    but the loader puts the initial values in the FLASH (inidata).
    It is one task of the startup to copy the initial values from FLASH to RAM. */
    .data  : AT ( _sidata )
    {
        . = ALIGN(4);
        /* This is used by the startup in order to initialize the .data secion */
        _sdata = . ;
        
        *(.data)
        *(.data.*)


        . = ALIGN(4);
        /* This is used by the startup in order to initialize the .data secion */
        _edata = . ;
    } >RAM
    
    


    /* This is the uninitialized data section */
    .bss :
    {
        . = ALIGN(4);
        /* This is used by the startup in order to initialize the .bss secion */
        _sbss = .;
        
        *(.bss)
        *(COMMON)
        
        . = ALIGN(4);
        /* This is used by the startup in order to initialize the .bss secion */
        _ebss = . ;
    } >RAM
    
    PROVIDE ( end = _ebss );
    PROVIDE ( _end = _ebss );
    
    /* This is the user stack section 
    This is just to check that there is enough RAM left for the User mode stack
    It should generate an error if it's full.
     */
    ._usrstack :
    {
        . = ALIGN(4);
        _susrstack = . ;
        
        . = . + _Minimum_Stack_Size ;
        
        . = ALIGN(4);
        _eusrstack = . ;
    } >RAM
    


   
    /* this is the FLASH Bank1 */
    /* the C or assembly source must explicitly place the code or data there
    using the "section" attribute */
    .b1text :
    {
        *(.b1text)                   /* remaining code */
        *(.b1rodata)                 /* read-only data (constants) */
        *(.b1rodata*)
    } >FLASHB1
    
    /* this is the EXTMEM */
    /* the C or assembly source must explicitly place the code or data there
    using the "section" attribute */
    
    /* EXTMEM Bank0 */
    .eb0text :
    {
        *(.eb0text)                   /* remaining code */
        *(.eb0rodata)                 /* read-only data (constants) */
        *(.eb0rodata*)
    } >EXTMEMB0
    
    /* EXTMEM Bank1 */
    .eb1text :
    {
        *(.eb1text)                   /* remaining code */
        *(.eb1rodata)                 /* read-only data (constants) */
        *(.eb1rodata*)
    } >EXTMEMB1
    
    /* EXTMEM Bank2 */
    .eb2text :
    {
        *(.eb2text)                   /* remaining code */
        *(.eb2rodata)                 /* read-only data (constants) */
        *(.eb2rodata*)
    } >EXTMEMB2
    
    /* EXTMEM Bank0 */
    .eb3text :
    {
        *(.eb3text)                   /* remaining code */
        *(.eb3rodata)                 /* read-only data (constants) */
        *(.eb3rodata*)
    } >EXTMEMB3
    
    
    
    /* after that it's only debugging information. */
    
    /* remove the debugging information from the standard libraries */
    DISCARD :
    {
     libc.a ( * )
     libm.a ( * )
     libgcc.a ( * )
     }


    /* Stabs debugging sections.  */
    .stab          0 : { *(.stab) }
    .stabstr       0 : { *(.stabstr) }
    .stab.excl     0 : { *(.stab.excl) }
    .stab.exclstr  0 : { *(.stab.exclstr) }
    .stab.index    0 : { *(.stab.index) }
    .stab.indexstr 0 : { *(.stab.indexstr) }
    .comment       0 : { *(.comment) }
    /* DWARF debug sections.
       Symbols in the DWARF debugging sections are relative to the beginning
       of the section so we begin them at 0.  */
    /* DWARF 1 */
    .debug          0 : { *(.debug) }
    .line           0 : { *(.line) }
    /* GNU DWARF 1 extensions */
    .debug_srcinfo  0 : { *(.debug_srcinfo) }
    .debug_sfnames  0 : { *(.debug_sfnames) }
    /* DWARF 1.1 and DWARF 2 */
    .debug_aranges  0 : { *(.debug_aranges) }
    .debug_pubnames 0 : { *(.debug_pubnames) }
    /* DWARF 2 */
    .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
    .debug_abbrev   0 : { *(.debug_abbrev) }
    .debug_line     0 : { *(.debug_line) }
    .debug_frame    0 : { *(.debug_frame) }
    .debug_str      0 : { *(.debug_str) }
    .debug_loc      0 : { *(.debug_loc) }
    .debug_macinfo  0 : { *(.debug_macinfo) }
    /* SGI/MIPS DWARF 2 extensions */
    .debug_weaknames 0 : { *(.debug_weaknames) }
    .debug_funcnames 0 : { *(.debug_funcnames) }
    .debug_typenames 0 : { *(.debug_typenames) }
    .debug_varnames  0 : { *(.debug_varnames) }
}

参考文档:GCC参数详解

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

用GCC开发STM32,正点原子开发板的一个库函数版本例程示例 的相关文章

  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • 为什么 ld 无法从 /etc/ld.so.conf 中的路径找到库?

    我想添加 opt vertica lib64进入系统库路径 所以我执行以下步骤 1 添加 opt vertica lib64 into etc ld so conf 然后运行ldconfig 2 检查 bash ldconfig p gre
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • 如何将输入传递到扩展汇编中?

    考虑这段代码 来自我的先前的问题 https stackoverflow com questions 37955538 segfault on movq instruction int main asm movq 100000000 rcx
  • 这个反斜杠在这段汇编代码中起什么作用?

    我不确定这些推线有什么区别 修剪下来来自 Linux 的 x86 entry calling h https github com torvalds linux blob 241e39004581475b2802cd63c111fec43b
  • gcc 与 clang:符号剥离

    gcc 和 AMD Open64 opencc 都有一个 s选项 剥离符号表和重定位信息 到目前为止我还没能在 Clang LLVM 中找到相同的选项 它存在吗 您可以使用stripbinutils 中的实用程序 实际上 llvm ld 有
  • 避免 gcc 函数序言开销?

    我最近遇到了很多 gcc 在 x86 上生成非常糟糕的代码的函数 它们都符合以下模式 if some condition do something really simple and return else something comple
  • 无法链接 Boost 正则表达式

    我目前正在尝试编译一个KIT 的收缩层次实现 http algo2 iti kit edu english routeplanning php这需要 Boost Regex 提供的 Makefile 已经确保 并且我还手动仔细检查了这一点
  • 要求编译器发出无分支/恒定时间代码

    在密码学中 任何依赖于秘密数据 例如私钥 的代码都必须在恒定时间内执行 以避免侧信道定时攻击 https en wikipedia org wiki Timing attack 目前最流行的架构 x86 64 和 ARM AArch64 都
  • 链接器问题 - 未定义的引用

    我的编译器有问题 告诉我有一个 未定义的引用 我想在库中使用的函数 让我分享一些有关该问题的信息 我正在用 gcc 交叉编译 C 语言 我正在调用一个库函数 该函数通过包含的标头访问 其中包含另一个标头 其中包含原型 我已经使用 I 包含了
  • 如何在 GCC C++ 中编写多行内联汇编代码?

    这看起来不太友好 asm command 1 command 2 command 3 我真的必须在每一行加上双引号吗 另外 由于多行字符串文字在 GCC 中不起作用 我也无法欺骗它 我总是在互联网上找到一些例子 该人手动插入制表符和换行符而
  • 成员初始值设定项列表中的求值顺序是什么?

    我有一个带有一些参数的构造函数 我假设它们是按照列出的顺序初始化的 但在一种情况下 它们似乎是按相反的顺序初始化的 导致中止 当我反转参数时 程序停止中止 下面是我正在使用的语法的示例 a 之前需要初始化b 在这种情况下 你能保证这个初始化
  • 如何使用timeval结构计算毫秒?

    我想从 timeval 类型的变量中检索以毫秒为单位的值 以下是我的尝试 timeval time long int millis time gt tv sec 1000 time gt tv usec 1000 printf Second
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 为什么GCC的三元扩展不支持赋值?

    海湾合作委员会有一个很棒的 C 三元表达式扩展 http gcc gnu org onlinedocs gcc 4 2 4 gcc Conditionals html Conditionals这允许我们创建这样的语句 int x some
  • CLOCKS_PER_SEC 与 std::clock() 的结果不匹配

    我正在使用以下短程序来测试std clock include
  • long double(GCC 特定)和 __float128

    我正在寻找有关的详细信息long double and float128在 GCC x86 中 更多是出于好奇而不是因为实际问题 可能很少有人需要这些 我只是有史以来第一次 truly需要一个double 但我想知道你的工具箱里有什么以及它
  • Qt 编译器标志顺序

    我的目标是消除某些类型的编译器警告 我发现可以通过在 pro 文件中添加编译器标志来做到这一点 QMAKE CXXFLAGS Wno unused variable Wno reorder 问题是它们被添加在 Qt 构建系统生成的标志之前
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • 为什么 g++ 在编译的二进制文件中存储类名?

    我注意到如果我跑strings在我编译的程序上g 输出包含它使用的各种类的名称 该程序是用 O3并且没有 g or p 并且当我剥离二进制文件时 类名仍然存在 我想知道为什么有必要g 将此信息存储在二进制文件中 出现的类名似乎都是使用虚函数

随机推荐

  • Error[Pe147] in IAR

    系统 win10 IDE IAR MCU cc2530 Error Error Pe147 declaration is incompatible with banked func xdata reentrant void UartSend
  • 【vue】点击tab,变色

    项目场景 商城APP首页开发 点击tab 变色 问题描述 无法变色 debug过程 1 定位 click itemClick 漏传参数index 2 检查代码拼写是否有误 currentIndex 3 在itemClick方法里 打log
  • python制作二级菜单_python实现二级登陆菜单及安装过程

    python实现二级登陆菜单的代码如下所示 1 三级菜单 注册 登陆 注销 2 进入每一个一级菜单 都会有下一级的菜单 user item dict try while True print Welcome sir input choice
  • 异步线程进行事务的管理,异步线程事务失效解决方案

    场景 工作中使用到异步线程 在发生异常时对操作的数据进行回滚 使用 Transactional propagation Propagation REQUIRES NEW 失效 解决方式 进行手动提交事务 代码 TODO 获取当前线程请求头信
  • 百度Apollo视频学习笔记

    APOLLO视频学习笔记 一 总览 无人驾驶车的运作方式 五个核心部件 计算机视觉 弄清楚周围的世界是怎样的 传感器融合 合并来自其他传感器的数据 如激光和雷达 更加深入了了解我们周围的环境 定位 精确地确定我在世界所处的位置 路径规划 绘
  • vlc web 插件 js接口

    Embed tag attributes To embed the plugin into a webpage use the following template Required ele
  • 【IEEE】2022年第六届计算机科学与智能控制国际会议(ISCSIC 2022)

    2022年第六届计算机科学与智能控制国际会议 ISCSIC 2022 重要信息 会议网址 www iscsic org 会议时间 2022年11月11 13日 召开地点 中国北京 截稿时间 2022年10月11日 录用通知 投稿后2周内 出
  • 34-变量类型

    接33节 这节举了variable的数据类型 有个例子是bool类型和其他类型相加 比如bool 浮点 由于bool类型有0和1两个值的选择 所以相加时当做0或者1 这里默认值为1 即true 再加上个浮点类型 注意的是 浮点类型的默认值启
  • UnknownHostException: api.weixin.qq.com解决方法

    在使用微信服务过程中 调用api weixin qq com 总会碰到如下这种问题 java net UnknownHostException api weixin qq com 未知的名称或服务 关键是这种问题偶尔出现 我们在测试环境甚至
  • jee中的过滤器

    对于web app的开发者来说 过滤器 是最常见不过了 在web xml中经常可以看到这样的几行
  • 【转】sed 简明教程

    awk于1977年出生 今年36岁本命年 sed比awk大2 3岁 awk就像林妹妹 sed就是宝玉哥哥了 所以 林妹妹跳了个Topless 他的哥哥sed坐不住了 也一定要出来抖一抖 sed全名叫stream editor 流编辑器 用程
  • 老生常谈-FFmpeg 的编译问题轻松搞定

    前几天发了一篇 FFmpeg 调用 Android MediaCodec 进行硬解码 关于 FFmpeg 的编译 是个老生常谈的话题了 很多初学者都会卡在怎么编译动态库 so 的问题上 这其实也是 Android 开发转音视频的一大拦路虎
  • element-ui中el-tab的的使用

    element ui中el tab的的使用 el tab在页面中当作tab页使用如下 name就是与选项卡绑定值 value 对应的标识符 表示选项卡别名 用v model绑定值 选中选项卡的 name label 设置选项卡的标题 可以动
  • Mysql的mysql_store_result/mysql_use_result,mysql_field_count/mysql_num_fields/mysql_num_rows函数区别

    Mysql的mysql store result mysql use result mysql field count mysql num fields mysql num rows函数区别 1 先参考以下文章 或者先看下面再回来理解 my
  • list.clear()与=null以及new ArrayList<E>()的差异(Map类似)

    1 使用clear 方法 List
  • linux下载命令wget命令详解

    wget是linux最常用的下载命令 一般的使用方法是 wget 空格 要下载文件的url路径 例如 wget http www linuxsense org xxxx xxx tar gz 简单说一下 c参数 这个也非常常见 可以断点续传
  • Angular自定义表单验证

    前端表单验证 为年龄输入框添加了两个验证 并分情况填写了提示语
  • Android开发 之 指纹识别

    指纹识别 在android6 0的时候谷歌对指纹识别开始支持了 现在市面的基本上指纹识别都是在api23以上的版本 涉及到一个系统服务 FingerPrintManager 在使用FingerPrintManager这个类实现的时候发现了很
  • np.meshgrid()函数

    文章目录 1 自己理解 2 官方解释 3 参数 3 1 x1 x2 xn array like 3 2 sparse bool optional 默认false 3 3 copy bool optional 1 自己理解 np meshgr
  • 用GCC开发STM32,正点原子开发板的一个库函数版本例程示例

    GCC环境搭建 首先下载交叉编译环境GCC 这个网上有很多 百度一下就能找到下载 比如 Sourcery G for ARM EABI 我的CSDN资源里 有相关下载 熟悉下Makefile 强力推荐熟悉网络牛人李云的51cto博客 有一篇