• [技术干货] LiteOS_Lab Makefile分析 下
    第147到149行规则所需的依赖全部都生成好了,可以开始执行该规则的命令,将所有依赖通过LDFLAGS变量中的值链接生成Huawei_LiteOS.elf文件并列出程序文件中各段的大小。LDFLAGS变量中通过MCU变量定义了内核相关参数,例如ARM架构的版本以及是否支持硬件浮点数运算等参数,如下图所示,如果你需要将工程移植到不是STM32L431系类的MCU上,就需要修改MCU变量的值。LDFLAGS变量中通过LDSCRIPT变量读取os.ld链接脚本来控制程序该如何链接,每个段应该存放在程序中的何处,在os.ld链接脚本中还指明了MCU的RAM和FLASH大小及起始位置,我们在进行移植时也需要修改。Huawei_LiteOS.elf文件是第143至145行规则的依赖,将该elf文件转换为Huawei_LiteOS.hex和Huawei_LiteOS.bin文件,即可烧录。现在大家应该明白make控制下的整个程序编译过程了吧,以及Makefile文件起到的作用,我们再来看看前面的include导入的文件,如下图所示:首先导入了.config文件,这由Kconfig软件读取用户通过图形化配置的各项参数信息生成的,其中包含了对SDK中各组件参数的配置信息,如下图所示:以AT组件为例,CONFIG_AT_ENABLE=y代表使能AT组件;CONFIG_AT_DEVNAME="atdev"将AT组件用到的串口以"atdev"注册到driver层中;CONFIG_AT_OOBTABLEN=6 OOB表的长度配置为6个,这时用于接收异步数据的结构体,意味着我们最多能配置6个特定字符串,当这时字符串出现时调用相应处理函数进行处理;CONFIG_AT_RECVMAXLEN=1024将AT框架中的接收缓存区大小配置为1024字节,如果你的MCU资源受限可以减少这里的大小;CONFIG_AT_TASKPRIOR=10将AT任务的优先级配置为10,注意:这里只有第35行这条语句会影响Make的编译,其余语句是为了记录用户做了哪些配置和生成iot_config.h所用。       .config文件中所有的组件配置都和上面分析的一致,如果组件没有被使能如下图所示:相信大家看到这里又有新的疑问了,这些配置是如何影响到程序的编译呢?回到前面的第70行include $(SDK_DIR)/iot_link/iot.mk,来看看这个SDK/iot_link目录下的iot.mk文件中有什么你就有答案了,如下图所示:该Makefile将每个组件所属文件夹下的Makefile也导入进来了,我们还是以AT框架为例,第31行,导入at目录下的at.mk文件,该Makefile内容如下图所示:看到了吧,第7行与前面的CONFIG_AT_ENABLE=y变量相对应,ifeq ($(CONFIG_AT_ENABLE),y)语句的意思是如果CONFIG_AT_ENABLE变量的值为y,则将ifeq到endif之间的语句全部执行。       第8至9行将at目录下所有.c文件添加到C_SOURCES变量中,注意这里用的是+=是追加上去。       第11至12行将at目录下所有.h文件所在路径(注意是路径,通过-I参数指定头文件所在的路径,这样编译器才能找到头文件,否则会因为找不到头文件导致编译失败)添加到C_INCLUDES变量中,注意这里用的是+=是追加上去。       第14至14行将-D CONFIG_AT_ENABLE=1文本追加到C_DEFS变量中。       这三个变量大家都很眼熟吧,这就是工程目录/GCC目录中Makefile中的那三个变量,如下图所示:这样AT组件中的所有源文件和头文件就参与了编译。       回到第三个include,include $(MAKEFILE_DIR)/project.mk,这是用于包含(引入)工程目录/GCC目录下的project.mk,该Makefile部分内容如下图所示:主要用于包含Hal库中的文件以及用户自己添加进去的文件,这也是移植时需要进行修改的文件之一,大家可以仿照我前面分析的方法自己分析一下。最终所有被添加进入的.c源文件会被追加到C_SOURCES变量中,所有.h头文件所在的路径会被追加到C_INCLUDES变量中。总结以上就是LiteOS_Lab中Makefile运行的机制了,大家可以自己跟着文章全部分析分析一边以加深影响,SDK中所有的Makefile文件都不需要也不能进行修改,只需要修改工程中的三个Makefile,.config(这个不用手动修改,可以通过图形化配置进行修改),Makefile(根据目标MCU修改MCU相关的参数即可,也就是MCU这个变量的值),project.mk(根据目标MCU修改、添加或删除库文件以及用户文件以及最后的C_DEFS变量即可)。
  • [技术干货] LiteOS_Lab Makefile分析 上
    什么是MakefileMakefile是一个名为GNU-Make软件所需要的脚本文件,该脚本文件可以指导Make软件控制arm-gcc等工具链去编译工程文件最终得到可执行文件,几乎所有的Linux发行版都内置了GNU-Make软件,VScode等多种IED也内置了Make程序。你见到的xxx.mk文件或者Makefile都统称为Makefile脚本文件。Makefile脚本文件的语法学习可以参考:https://www.gnu.org/software/make/manual/make.html (GNU make官方文档)https://seisman.github.io/how-to-write-makefile/overview.html (跟我一起写Makefile 陈皓)Makefile的规则Makefile的规则如下,这里的[TAB]指键盘上的TAB按键,不是空格,如果在命令前输入了空格则会造成错误,并且在Makefile中TAB键不能随意使用:目标 : 依赖[TAB]命令 例如:Hello :       @echo “Hello”这时执行make命令就会输出一条语句”Hello”,Hello是目标,依赖为空,为了生成目标,需要执行echo “Hello”语句,从而导致输出Hello。 例如:假设我们有一个Hello.c C语言源文件,需要将其编译不链接为Hello.o文件,最后在进行连接,Makefile内容如下:Hello.out : Hello.o       gcc -o Hello.out Hello.oHello.o : Hello.c       gcc -c -o Hello.o Hello.c这时执行make命令,make解释器发现目标为“Hello.out”,但是生成Hello.out需要Hello.o,发现目录下找不到“Hello.o”,就向下查找是否有生成Hello.o的规则,找到了,发现”Hello.o”依赖于”Hello.c”,在目录下也找到了Hello.c,就执行语句“gcc -c -o Hello.o Hello.c”生成”Hello.o”,只要编译过程不出错,即可得到”Hello.o”,这时可以执行“gcc -o Hello.out Hello.o“生成”Hello.out”从哪里开始分析?这里可以用分析一个C语言或Java语言程序来类比,一般都是根据程序是执行流来进行分析,也就是先找到main函数,因为main函数是程序的执行入口,Makefile也有执行入口,在执行make命令时,make解释器默认搜索当前目录下名为“Makefile”的文件,找到后,执行生成第一个目标的命令及生成其依赖所需的命令。这里选择在SDK/Targets目录中STM32L431_BearPi工程中的GCC目录下的Makefile开始分析。第1行到第140行都是设置一些变量和导入一些makefile文件(其中也没有任何规则,都是进行一些变量的设置),第143行是第一条规则当我们执行make或make all时,就开始生成all目标,其依赖于BUILD_DIR(GCC/build)目录中的TARGET(Huawei_LiteOS).elf文件,BUILD_DIR和TARGET为两个变量,一开始就被赋值,如下图所示,实际使用时$(变量)会被替换为变量的值,例如$(TARGET).elf最终会被替换为Huawei_LiteOS.elf。可是Huawei_LiteOS.elf还不存在,make只好继续向下查找是否有生成Huawei_LiteOS.elf的规则,好在第147行的目标为Huawei_LiteOS.elf,这就是生成Huawei_LiteOS.elf的规则,该规则依赖为$(OBJ_DIRS) $(C_OBJ) $(S_OBJ)分别对应三个目录,这三个目录都不存在,所以make只好继续向下查找,它发现第152行正好为目标是该目录的规则,就创建了该目录,解决了$(OBJ_DIRS)这个依赖,接着该处理$(C_OBJ)这个依赖Make向下查找依赖发现位于第156行出现生成这个以来的规则,这里的$(C_OBJ):$(BUILD_DIR)/%.o:%.c对应makefile中的静态模式,我这里简单的说一下,大家如果想深入了解可以自行百度。静态模型的格式如下:目标列表: 与目标列表相匹配的模型: 与依赖相匹配的模型[TAB]命令来看一个例子, 目标列表中有foo.o、bar.o和test.s三个值,首先将匹配%.o的模型找出来,test.s不匹配就被遗弃了,将匹配的foo.o和bar.o替换为foo.c和bar.c,最终这一条规则等于执行了下列这两条规则,为什么要这样做呢?你可以试想以下,假设目标列表中有几千个文件,这样做的话是不是就可以少写很多规则:       回到LiteOS_Lab的Makefile上来,156行将C_OBJ变量中的符合build/xxx.o格式的文件作为xxx.c格式的依赖,C_OBJ变量的赋值如下图所示:$(patsubst PATTERN, REPLACEMENT, TEXT)函数的作用是模式替换,将TEXT中以空格隔开的每个单词(文件名),符合PATTERN格式的替换为REPLACEMENT格式,例如第124行,将所有的C_SOURCE变量中的文件名,凡是只要在SDK/ iot_link目录下的都替换为.o后缀,SDK/ iotlink目录中有一个符合该模型的文件,link_main.c,在执行该规则对应的命令时,目标文件为link_main.o,第125和126行同上。这里以link_main.c为例向大家讲解指令,经过模式替换后规则如下:link_main.o: link_main.c       $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(@:%.o=%.lst) $<  -o $@这里的CC是指arm-none-eabi-gcc,CFLAGS是指各类编译参数,例如-MMD -MP -Wno-missing-braces,$(@:%.o=%.lst)函数的作用是将$@目标符合%.o模型的值替换为%. lst,这里就将link_main.o替换link_main. lst,$<是指第一个依赖,$@是指目标,组合的命令后如下:arm-none-eabi-gcc -c -MMD -MP -Wno-missing-braces -Wa,-a,-ad,-alms=link_main. lst link_main.c  -o link_main.o。一句话来说就是将所有的.c源文件编译不链接生成.o文件和.lst文件,等待后续进一步操作。第160和161行的操作类似于上面的操作,将所有的汇编文件都编译不链接生成.o文件等待后续进一步操作。
  • [技术干货] STM32L476移植华为LiteOS系列教程---修改Makefile文件5
    摘要:本节将对前几节中创建好的工程进行进一步的修改,使其适配我们的STM32L476一、修改GCC/project.mk文件project.mk文件主要用于指示我们的arm-gcc工具链如何对我们的工程文件进行编译操作,有关编译、链接等操作可以参考0x01基础知识中的介绍。首先将文件中所有的STM32L431_BearPi_OS_Func全部替换为STM32L476RG_NB476在HAL_DRIVER_SRC 变量中删除我们没有用到的STM32的库文件,并添加上使用了没有添加的文件,修改好后如下图在HARDWARE_SRC变量中删除我们没有使用的外设驱动文件,添加上使用了的外设驱动文件,修改后如下图,以下用到的驱动代码给大家在附件中放上,解压到Hardware文件夹即可在USER_SRC变量中删除我们没有使用的内部外设初始化,添加上使用了的内部外设初始化文件,也就是也就是前面我们勾选的将初始化代码分别生成到不同文件中的选项,修改后如下图:并将C_DEFS +=  -D USE_HAL_DRIVER -D STM32L431xx -D NDEBUG中的STM32L431xx替换为STM32L476xx二、再次复制部分文件从targets\STM32L431_BearPi\Src和Inc中复制以下文件到我们的Src和Inc中dwt.c  dwt.h   用于延时sys_init.c sys_init.h 用于配置系统时钟、获取随机数、重启系统等ota_port.c 用于OTAflash_adaptor.c 用于读、写Flashuart_debug.c    用于实现fputc和fgetc、处理串口中断、初始化shellat_hal.h            用于发送AT指令board.h            OTA相关common.h        OTA相关PS:附件中的“资料”是我修改好的project.mk和Hardware中用到的驱动文件,解压后,将project.mk放到GCC目录下即可,将其余文件放到Hardware目录下即可!
  • [应用开发] hiai_demo中想使用ros,如何配置makefile文件?
    如题,我对hiai_demo更改了一点,但是用到了ros,在进行工程编译时,需要用到ros相关的库。假如我的ros的库的路径为:/opt/ros/kinetic我应该如何更改makefile-main以及makefile-so这两个文件。
  • [技术干货] 【经验分享】linux交叉编译 - openssl动态库
    一、准备工作    1、到openssl官网下载最新版本openssl(如openssl-1.1.1d.tar.gz),上传到linux编译机上(如上传到目录/home/test下),并使用tar -xvf openssl-1.1.1d.tar.gz解压:        2、将要用到的交叉编译工具链解压后,找到交叉编译器所在路径(如果直接使用系统的gcc,可跳过这一步,但要保证gcc已安装):        注意:gcc/g++/ar/ranlib/nm等文件的名字根据编译链的不同,文件名开头会有所不同,但文件名结尾是不变的,如arm架构比较常见的编译器是arm-linux-gcc二、配置       进入openssl源码目录,运行如下配置命令    ./config shared --prefix=/home/test/openssl --openssldir=/home/test/openssl/ssl或./config  no-asm shared --prefix=/home/test/openssl --openssldir=/home/test/openssl/ssl    其中prefix 是安装目录,openssldir 是配置文件目录,shared 作用是生成动态链接库(即.so库)     注意:no-asm表示不使用汇编代码,如果编译有问题再加,没有问题就不加        注意: 如果遇到64位的编译链,需要添加sysroot参数,用如下命令配置(+参考图片):    ./config no-asm shared --prefix=/home/test/openssl --openssldir=/home/test/openssl/ssl --sysroot="{头文件所在路径}"        一般来说,头文件所在路径 与 XXX-gcc/g++/ar/nm等(XXX是交叉编译器名字的前缀)的所在目录不一样,在另外一个大目录下(如下图所示)        Tips:     可以先用find ./ -name *-gcc命令找到gcc/g++/ar/ranlib/nm等文件所在目录,那另一个目录就是头文件所在路径        从上图看,gcc/g++/ar/ranlib/nm等文件在sysroots/x86_64-fslsdk-linux的某目录,所以头文件一般在另一个目录sysroots/ppc64e6500-fsl-linux下,且sysroots/ppc64e6500-fsl-linux下的usr/include目录下面有许多(不是一两个)头文件(也就是说--sysroot的值是usr/include所在的目录):    三、修改Makefile    配置完成后会在openssl源码目录下生成一个Makefile文件,打开查看内容,会看到CROSS_COMPILE的值是空的        这时要将CROSS_COMPILE的值修改为XXX-gcc所在绝对路径+XXX-gcc的文件名前缀(参考下图),也就是说要先找到交叉编译工具xxx-gcc/g++/ar/nm等文件所在路径(其中“XXX-”是交叉编译工具文件名前缀):        修改CROSS_COMPILE的值最终是为了修改arm-linux-xxx-gcc/ar/ranlib/nm等的路径,在比较老的openssl版本中,没有CROSS_COMPILE参数,需要修改如下5个变量的值 (注意下图所用的交叉编译工具不是跟前面的不一样,所以路径也不同):    四、编译出库        修改完Makefile后就可以进行编译了,到openssl源码目录下,运行make命令:    openssl源码目录下,运行make命令:    make    如果没有报错,再运行make install    make install    在配置的openssl安装目录下/home/test/openssl找到lib目录,有如下两个文件:    libcrypto.so.1.1、libssl.so.1.1和软链接libcrypto.so、libssl.so        五、其他说明    1、交叉编译工具不是在任何环境上都可使用的,需要系统环境和编译工具匹配才可以,主要看CPU和指令集    2、如果不需要交叉编译工具,而是直接使用gcc,那么,配置生成Makefile后不需要修改Makefile(即跳过第三步),直接编译即可    3、如果make出错后修改了Makefile,记得make clean后再make    4、有的编译工具是32位的,如果在64位的linux机器上使用,可能会报如下错误,这时只要将Makefile中的-m64都删除,再进行编译即可          
  • [HPC] CAMx 6.50 移植指南(CentOS 7.6)
    文档位置已迁移至如下链接:https://support.huaweicloud.com/prtg-kunpenghpcs/kunpenghpcs_prtg_0005.html
  • [HPC] Stream测试指导书
    文档位置已迁移至如下链接:https://support.huaweicloud.com/tstg-kunpenghpcs/kunpenghpcs_tstg_0003.html
  • 中标麒麟7U6源码安装nmon16k及基本的使用
        记录一下nmon16k的安装过程及使用方法,方便以后参考1、操作系统:中标麒麟7U6,已安装好gcc7.3(关于安装gcc写在MySQL的安装文档中),cmake3.9.2,ncurses-devel*2、安装包获取:nmon官网地址http://nmon.sourceforge.net/pmwiki.php?n=Site.CompilingNmon,按住CTRL+F输入lmon16k.c,回车即可定位到;同理搜索makefile(点击下载之后会跳转到下载页面,等待几秒即可开始下载)3、在/opt目录下创建一个nmon的目录用于存放lmon16k.c和makefile文件4、准备编译 vi makefile ,控制模式下输入/arm,定位到arm版本位置,选择需要的版本复制并退出5、cp lmon16k.c lmon.c重命名文件6、执行编译 make nmon_arm_raspian(就是前面复制的编译命令),等待完成,完成之后会生成一个nmon_arm_raspian文件7、完成后在当前目录下执行./nmon_arm_raspian进入交互界面也可以通过命令行模式生成报告./nmon_arm_raspian -f -s 1 -c 600 -m /opt说明:-f表示生成文件;-s参数指定采集频率,单位是秒;-c指定采集次数;-m指定文件生成位置 ;最后生成的文件是以主机名+时间戳命名的
  • [Atlas500] DDK样例中Makefile的CC_PATTERN是ASIC还是Atlas?
    在${DDK_HOME}/samples/中的样例中,Makefile_main和Makefile_device需要选择CC_PATTERN为ASIC 还是Atlas请问将out文件放到Atlas500上运行,算是ASIC还是Atlas?
  • [问题求助] 按照示例的分类网络Engine编排,编排出的Makefile是针对arm系统的,无法在x86上运行
    MindSporeServer端版本:1.3.T34.B891MindSporeServer端OS版本:Ubuntu 16.04 x86_64安装包如下图按照分类网络Engine编排示例,创建工程,编排mind文件,并点击generate,查看生成的Makefile生成为arm64的文件,点击run后会生成arm64的二进制文件,导致执行失败
  • [技术干货] 【趁热打“帖”】从Makefile分析LiteOS Studio编译Liteos的流程。
    在用LiteOS Studio编译和烧录文件时,大家是否清楚,代码是怎么构建起来的,最终烧录到开发版的文件是哪个,怎么生成的?在导入工程后,都是需要设置我们工程的Makefile,LiteOS Studio才能正常编译我们的代码,有没有朋友认真地看过这个文件?前方高能!!接下来我们对这个文件来进行肢解!!!!我们以小熊开发部提供的样例(E53_IA1)来进行分析:Makefile 所在目录:E53_IA1\targets\STM32L431_BearPi\GCC\Makefile简单的普及下Makefile几个怪怪的符号,大佬请忽略:格式:[目标文件 产品] : [依赖文件,原材料]        对原材料的处理样例:XXX : aaa bbb ccc    $(CC) $^ -o $@    $(CC) $< -o $@$@--目标文件->XXX $^--所有的依赖文件->aaa bbb ccc$<--第一个依赖文件->aaa还有一个%.c  代表所有以.c结尾的文件makefile里的函数:return = $(functionname  arg1,arg2,arg3...)。这里用到的函数有:$(addprefix 前缀,加前缀对象) 加前缀函数。$(notdir $(C_SOURCES:.c=.o)) 去除所有的目录信息,文件名列表将只有文件名$(sort $(dir $(C_SOURCES))) 排序函数 并去重$(dir $(C_SOURCES)) 取目录函数$(wildcard $(BUILD_DIR)/*.d)  扩展通配符 列举所有.d文件继续!!!!//包含配置选项文件include config.mkinclude prune.mk//定义我们生成目标文件名,最终我们会生成.elf .bin .hex这三个家伙,用于烧录和调试TARGET = Huawei_LiteOS定义编译工具链:PREFIX    = arm-none-eabi-//编译链前缀CC        = $(PREFIX)gcc //编译工具AS        = $(PREFIX)gcc -x assembler-with-cpp   //汇编工具OBJCOPY   = $(PREFIX)objcopy      //拷贝工具 可以进行格式转换OBJDUMP   = $(PREFIX)objdump   //反汇编工具AR        = $(PREFIX)ar    //打包工具 生成静态库SZ        = $(PREFIX)size   //列出程序文件中各段的大小LD        = $(PREFIX)ld    //链接工具HEX       = $(OBJCOPY) -O ihex   //生成十六进制文件BIN       = $(OBJCOPY) -O binary -S   //生成二进制镜像文件  用户烧录//定义编译文件生成目录BUILD_DIR = build添加原材料:添加汇编源码ASM_SOURCES_s =  \       ${wildcard $(PROJECTBASE)/los_startup_gcc.s}添加C语音源码 .......C_SOURCES += $(HAL_DRIVER_SRC).......添加宏定义 .......C_DEFS += -DMBEDTLS_DEBUG_C .......添加C语音头文件 .......C_INCLUDES += $(OTA_INC) .......添加汇编头文件AS_INCLUDES = 生成汇编混编文件(.lst):$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)         //在生成.o的文件的同时,将“-a,-ad,-alms=XX”选项传递给汇编程序,生成.lst文件,这些文件在单步调试,汇编代码窗口,显示的就是该文件。$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@左边为main.lst 右边为单步调试时,汇编窗口。生成依赖关系信息文件(.d):  (这是我们看到build目录下有很多.d文件的原因)CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" //包含所有.d文件。-include  当文件不存在是不报错退出。没带“-”则会报错退出-include $(wildcard $(BUILD_DIR)/*.d)材料准备好了,开始生产拉设置编译选项CFLAGS设置引用的库LIBS设置链接选项LDFLAGS开始生产者三个家伙啦!all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin文件生成路径:.c  --->  .o  ---> .elf --->.bin .hex                           ^                            |.s --->  .o---------//编译所有.c文件$(BUILD_DIR)/%.o: %.c Makefile config.mk prune.mk | $(BUILD_DIR)$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@//编译所有.s汇编文件$(BUILD_DIR)/%.o: %.s Makefile config.mk prune.mk | $(BUILD_DIR)$(AS) -c $(CFLAGS) $< -o $@//生成ellf文件$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile config.mk prune.mk$(CC) $(OBJECTS) $(LDFLAGS) -o $@$(SZ) $@//生成十六进制文件$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)$(HEX) $< $@//生成二进制文件$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)$(BIN) $< $@后续将以此作为学习笔记,从不同的角度来学习liteos及iot相关的知识:下一个笔记:利用对比工具,看看开发版提供的例程和liteos源码的区别,浅谈liteos的移植。
  • [问题求助] 请问,使用Mind Studio创建的SSD工程,在ubuntu通过Makefile编译的可执行文件运行以后没有结...
    graph需要里面依赖的动态库也通过Makefile编译生成的。
总条数:27 到第
上滑加载中