鸿蒙移植i.mx6ull(六) Kconfig_GCC_Mkefile(下)

简介: 鸿蒙移植i.mx6ull(六) Kconfig_GCC_Mkefile

1.5 实现单选choice/endchoice


1.5.1 示例

1670999755213.jpg

在上述界面中,对于LiteOS_Compiler_Type,有2个选择:arm-linux-ohoseabi、clang-llvm。

在Kconfig文件中怎么描述?如下:

menu "Compiler"
choice
    prompt "LiteOS_Compiler_Type"
    default COMPILER_CLANG_LLVM
    help
      Enable arm-himix100 or aarch64-himix100 or compiler.
config COMPILER_HIMIX_32
    bool "arm-linux-ohoseabi"
    depends on PLATFORM_HI3518EV300 || PLATFORM_HI3516DV300 || PLATFORM_IMX6ULL || PLATFORM_STM32MP157
config COMPILER_CLANG_LLVM
    bool "clang-llvm"
        depends on PLATFORM_HI3518EV300 || PLATFORM_HI3516DV300 || PLATFORM_IMX6ULL || PLATFORM_STM32MP157
endchoice
endmenu


1.5.2 语法


解释如下:


choice表示"选择"

choice和endchoice之间的entry是可以选择的项目

它们之间,只能有一个被设置为"y":表示编进内核

它们之间,可以设置多个为"m":表示编译为模块

比如一个硬件有多个驱动程序

同一时间只能有一个驱动能编进内核

但是多个驱动都可以单独编译为模块


1.6 menuconfig


menuconfig XXX和config XXX类似, 唯一不同的是该选项除了能设置y/m/n外,还可以实现菜单效果(能回车进入该项内部)。


1.6.1 示例

1670999812086.jpg

对于上述界面,Kconfig文件中代码如下:

menuconfig OF
        bool "Device Tree and Open Firmware support"
        help
          This option enables the device tree infrastructure.
          It is automatically selected by platforms that need it or can
          be enabled manually for unittests, overlays or
          compile-coverage.
if OF
config OF_UNITTEST
        bool "Device Tree runtime unit tests"
        depends on OF_IRQ
        select OF_EARLY_FLATTREE
        select OF_RESOLVE
        help
          This option builds in test cases for the device tree infrastructure
          that are executed once at boot time, and the results dumped to the
          console.
          If unsure, say N here, but this option is safe to enable.
config OF_OVERLAY
        bool "Device Tree overlays"
        select OF_DYNAMIC
        select OF_RESOLVE
        help
          Overlays are a method to dynamically modify part of the kernel's
          device tree with dynamically loaded data.
          While this option is selected automatically when needed, you can
          enable it manually to improve device tree unit test coverage.
endif # OF


1.6.2 语法


menuconfig常用格式有2种:

menuconfig M
  if M
      config C1
      config C2
  endif


或:

menuconfig M
  config C1
      depends on M
  config C2
      depends on M


第1项menuconfig M跟config M语法是一样的, 不同之处在于menuocnfig M后面可以跟着好几个依赖于M的config C1、config C2等子配置项。


1.7 if/endif


1.7.1 语法


在上面的menuconfig中就有if/endif的使用,它的语法如下:

"if" <expr>
<if block>
"endif"


1.7.2 示例


示例如下,只有定义的OF项,OF_UNITTEST和OF_OVERLAY才会显示出来:

if OF
config OF_UNITTEST
        bool "Device Tree runtime unit tests"
        depends on OF_IRQ
        select OF_EARLY_FLATTREE
        select OF_RESOLVE
        help
          This option builds in test cases for the device tree infrastructure
          that are executed once at boot time, and the results dumped to the
          console.
          If unsure, say N here, but this option is safe to enable.
config OF_OVERLAY
        bool "Device Tree overlays"
        select OF_DYNAMIC
        select OF_RESOLVE
        help
          Overlays are a method to dynamically modify part of the kernel's
          device tree with dynamically loaded data.
          While this option is selected automatically when needed, you can
          enable it manually to improve device tree unit test coverage.
endif # OF


1.8 source


source 语句用于读取另一个文件中的 Kconfig 文件,如:

source "../../kernel/liteos_a/platform/Kconfig"


1.9 comment


comment 语句出现在界面的第一行,用于定义一些提示信息,如:

config ARCH_ARM
   bool
source "arch/arm/Kconfig"
comment "Extra Configurations"
config ARCH_FPU_DISABLE
    bool "Disable Floating Pointer Unit"
    default n
    help
      This option will bypass floating procedure in system.


界面如下:

1670999897221.jpg


2.准备工作


安装软件在GIT仓库:

doc_and_source_for_openharmony\工具\
    codeblocks-20.03mingw-setup.exe
    make-3.81.exe


2.1. arm-linux-gcc和gcc是类似的

arm-linux-gcc

给ARM芯片编译程序

gcc

在x86编译程序

用法基本一样

为方便演示,我们使用gcc

为了方便在windows下演示,我们使用Code::Blocks

它的安装程序自带gcc


2.2. Code::Blocks


它是一款基于GCC的windows IDE,可以用来开发C/C++/Fortran。

官网地址:http://www.codeblocks.org/


在我们提供的GIT仓库里也有:git clone https://e.coding.net/weidongshan/openharmony/doc_and_source_for_openharmony.git

下载GIT后,在工具目录下。


2.2.1 安装


按提示安装。


2.2.2 设置windows环境变量


在Path环境变量中添加:C:\Program Files\CodeBlocks\MinGW\bin


2.2.3 命令行示例


启动Git Bash,编译程序hello.c:

#include <stdio.h>
int main(void)
{
  printf("hello, world!\n");
  return 0;
}


编译、运行命令如下:

gcc -o hello  hello.c
./hello.exe


2.3. Make


安装make-3.81.exe后,在Path环境变量中添加:C:\Program Files (x86)\GnuWin32\bin


3.gcc编译过程详解


配套源码在GIT仓库里各个板子的source\02_录制视频时编写的源码\01_gcc_options里。


3.1. 程序编译4步骤


1670999994169.jpg

我们经常使用“编译”泛指上面的4个步骤之一,甚至有时候会囊括这四个步骤。


3.2. gcc的使用方法


gcc  [选项]   文件名


3.2.1 gcc使用示例


gcc hello.c                   // 输出一个名为a.out的可执行程序,然后可以执行./a.out
gcc -o hello hello.c          // 输出名为hello的可执行程序,然后可以执行./hello
gcc -o hello hello.c -static  // 静态链接
gcc -c -o hello.o hello.c  // 先编译(不链接)
gcc -o hello hello.o       // 再链接


3.2.2 gcc常用选项


3.2.2.1 手工控制编译过程

选项 功能
-v 查看gcc编译器的版本,显示gcc执行时的详细过程
-o 指定输出文件名为file,这个名称不能跟源文件名同名
-E 只预处理,不会编译、汇编、链接t
-S 只编译,不会汇编、链接
-c 编译和汇编,不会链接


一个c/c++文件要经过预处理、编译、汇编和链接才能变成可执行文件。

(1)预处理

C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“.i”文件中等待进一步处理。

(2)编译

编译就是把C/C++代码(比如上述的“.i”文件)“翻译”成汇编代码。

(3)汇编

汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现为ELF目标文件(OBJ文件)。“反汇编”是指将机器代码转换为汇编代码,这在调试程序时常常用到。

(4)链接

链接就是将上步生成的OBJ文件和系统库的OBJ文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件。


hello.c(预处理)->hello.i(编译)->hello.s(汇编)->hello.o(链接)->hello 详细的每一步命令如下:

gcc -E -o hello.i hello.c
gcc -S -o hello.s hello.i
gcc -c -o hello.o hello.s
gcc -o hello hello.o


上面一连串命令比较麻烦,gcc会对.c文件默认进行预处理操作,使用-c再来指明了编译、汇编,从而得到.o文件,再将.o文件进行链接,得到可执行应用程序。简化如下:

gcc -c -o hello.o hello.c//前三步骤
gcc -o hello hello.o


3.2.2.2 使用后缀名决定编译过程


参考《嵌入式Linux应用开发完全手册》:


总结 * 输入文件的后缀名和选项共同决定gcc到底执行那些操作

在编译过程中,最后的步骤都是链接

除非使用了-E、-S、-c选项

或者编译出错阻止了完整的编译过程


3.2.2.3 指定头文件目录


头文件在哪里?


系统目录 * 系统目录在哪?工具链里的某个include目录

怎么确定?

```
echo 'main(){}'| gcc -E -v -  // 它会列出头文件目录、库目录(LIBRARY_PATH)
```


可以不使用系统include目录吗?可以,编译时指定参数-nostdinc

可以自己指定头文件目录

-I <头文件目录>


3.2.2.4 指定库文件


库文件在哪里?


系统目录 * 系统目录在哪?工具链里的某个lib目录

怎么确定?

```
echo 'main(){}'| gcc -E -v -  // 它会列出头文件目录、库目录(LIBRARY_PATH)
```


可以不使用系统lib目录吗?可以,编译时指定参数-nostdlib

可以自己指定库文件目录

-L <库文件目录>


指定库文件

-l  <abc>   // 链接 libabc.so 或 lib.a


3.3 开发板程序编译示例


最后链接时,使用arm-linux-ld而不是使用arm-linux-gcc


前者可以完全自己指定所连接的文件

后者会链接一些默认的启动文件


3.4 参考书籍


《嵌入式Linux应用开发完全手册》中的《3.1 交叉编译工具选项说明》


4.makefile


看这个

相关文章
|
Linux 芯片
鸿蒙移植i.mx6ull(十) 系统时钟
鸿蒙移植i.mx6ull(十) 系统时钟
311 0
鸿蒙移植i.mx6ull(十) 系统时钟
|
Shell Python
鸿蒙移植i.mx6ull(十二) 根文件系统
鸿蒙移植i.mx6ull(十二) 根文件系统
206 0
鸿蒙移植i.mx6ull(十二) 根文件系统
|
存储 Linux 内存技术
鸿蒙移植i.mx6ull(十一) 存储设备驱动程序(基于IMX6ULL)
鸿蒙移植i.mx6ull(十一) 存储设备驱动程序(基于IMX6ULL)
326 0
鸿蒙移植i.mx6ull(十一) 存储设备驱动程序(基于IMX6ULL)
|
Shell
鸿蒙移植i.mx6ull(九) 串口移植(基于IMX6ULL)
鸿蒙移植i.mx6ull(九) 串口移植(基于IMX6ULL)
476 0
鸿蒙移植i.mx6ull(九) 串口移植(基于IMX6ULL)
|
C语言
鸿蒙移植i.mx6ull(八) 添加一个单板(下)
鸿蒙移植i.mx6ull(八) 添加一个单板
137 0
鸿蒙移植i.mx6ull(八) 添加一个单板(下)
|
芯片
鸿蒙移植i.mx6ull(八) 添加一个单板(上)
鸿蒙移植i.mx6ull(八) 添加一个单板
313 0
鸿蒙移植i.mx6ull(八) 添加一个单板(上)
|
20天前
|
JavaScript 安全 前端开发
【HarmonyOS开发】ArkTS基础语法及使用(鸿蒙开发基础教程)
【HarmonyOS开发】ArkTS基础语法及使用(鸿蒙开发基础教程)
259 4
|
20天前
|
存储 数据安全/隐私保护
鸿蒙开发:自定义一个动态输入框
在鸿蒙开发中,如何实现这一效果呢,最重要的解决两个问题,第一个问题是,如何在上一个输入框输入完之后,焦点切换至下一个输入框中,第二个问题是,如何禁止已经输入的输入框的焦点,两个问题解决完之后,其他的就很是简单了。
45 13
鸿蒙开发:自定义一个动态输入框
|
23天前
|
小程序 测试技术 API
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
本文详细介绍元服务的开发及上架全流程,涵盖元服务的特点、创建项目、服务卡片、签名打包、开发测试及上架审核等环节,帮助开发者轻松掌握从零开始开发并发布元服务的全过程。元服务以其轻量、免安装、易于使用等特点,成为未来服务提供的重要形式。
58 13
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
|
28天前
|
Android开发
鸿蒙开发:自定义一个简单的标题栏
本身就是一个很简单的标题栏组件,没有什么过多的技术含量,有一点需要注意,当使用沉浸式的时候,注意标题栏的位置,需要避让状态栏。
鸿蒙开发:自定义一个简单的标题栏