# mytry6 **Repository Path**: resourcess/mytry6 ## Basic Information - **Project Name**: mytry6 - **Description**: 小哨兵4g路由器模块系统,无法导入,只能手动获取: https://gitee.com/ashyelf/mytry6.git - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-04-08 - **Last Updated**: 2024-02-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ------ ## SDK平台下载或更新 #### SDK更新 在下载完本项目后需要在顶层目录下执行以下指令来指定产品型号 ``` make pid gBOARDID=产品完整型号 ``` 其中 ***产品完整型号*** 在产品网页的开发指导页上会有示例, 之后再执行以下指令来更新产品对应的SDK ``` make update ``` 通过以上两步即可更新产品型号对应的SDK #### SDK选译编译指定的软件包 在顶层目录下执行 ``` make menuconfig ``` 将会显示出产品对应的软件包菜单, 可进去勾选或去勾选编译产品相关的软件包 #### SDK编译 在SDK下载完成后在顶层目录下执行 ``` make dep make ``` 即可编译产品型号对应的固件 #### 固件升级 编译完成后会在build目录下生产一个.zz结尾固件升级包 #### 更新固件 通过在网页界面中的 系统=>软件管理=>软件更新 来点选.zz结尾的固件升级包来更新固件 *注意:开发固件升级后可能导致不启动,如果不启动请手动通过复位按键复位设备即可* ------ ## SDK源代码目录介绍 #### doc --- 文档目录 * doc/use: 管理说明 * doc/com: 组件接口文档 * doc/dev: 开发文档及API介绍 * doc/proto: 协议文档 #### project --- 存放项目的目录 * 以下为时间管理(clock)项目示例说明项目下的各种文件 - project/clock: 系统的时间管理项目 - project/clock/prj.inf: 项目信息文件, 里面对项目非常重要的信息, 通常在创建项目时会自动生成, 通常不需要用户手动编辑, fpk.md有更详细的描述 - project/clock/date: 时间管理组件代码, 在运行系统中通过clock@date组件名可定位到此组件并对其管理 - project/clock/date.cfg: 时间管理组件的默认配置 - project/clock/restart: 定时重启组件代码, 在运行系统中通过clock@restart组件名定位 *注: 项目下所有组件,在运行系统中通过 项目名@组件名 可定位到此组件并对其调用或管理* - project/clock/restart.cfg: 定时重启组件的默认配置 *注: 项目下所有.cfg结尾的文件都是同名组件的默认配置* - project/clock/date.md: 时间管理组件的说明(Markdown语法) - project/clock/restart.md: 定时重启组件的说明 *注: 项目下所有.md结尾的Markdown文档都是同名组件对应的功能及接口说明* - project/ntpclient: NTP协议对时C程序目录 - project/clock/Makefile: 项目的编译文件, 通常在创建项目时会自动生成 #### config: 产品定制目录 * config/<厂商>, 厂商配置目录: 基于原厂SDK编译时的一些特性形成的一些差异文件, 如: - 联发科系列的配置目录存放在config/mtk中 - Atheros系列的配置目录存放在config/ath中 - 高通系列的配置目录存放在config/qca中 * config/<厂商>/<芯片>, 芯片配置目录: 基于芯片型号或硬件型号的一些特性形成的一些差异文件, 如: - 联发科MT7628的芯心的配置目录存放在config/mtk/mt7628中 - 高通的qca9531芯心的配置目录存放在config/qca/qca9531中 * config/<厂商>/<芯片>/<型号>, 产品型号配置目录: 基于硬件PCBA的型号版本的一些特性形成的一些差异文件, 如: - 联发科的MT7628的芯心形成的R103的型号的产品的配置目录存放在config/mtk/mt7628/r103中 - Atheros的ar9331的芯心形成的r100的型号的产品的配置目录存放在config/ath/ar9331/r100中 #### tools: 编译或开发项目时可能用到的工具 #### Makefile: Makefile编译脚本文件 #### readme.md: SDK说明文档, 即当前文档 ------ ## 编译时的宏 #### 重要的配置宏 - gBOARDID : 当前要编译的产品的完整型号, 可以在Makefile中指定, 也可编译时命令行指定, 示例使用的是在命令行中给出 - gPLATFORM : 当前编译的厂商标识, 从gBOARDID宏可获到 - gHARDWARE : 当前编译的芯片标识, 从gBOARDID宏可获到 - gCUSTOM : 当前编译的产品型号(PCBA)标识, 从gBOARDID宏可获到 - gSCOPE : 当前编译的定制标识, 从gBOARDID宏可获到 - gVERSION : 版本标识 - gMAKER : 编译人员名称 #### 常用的目录宏 - gTOP_DIR : 顶层目录, 整个SDK的根目录 - gSDK_DIR : 当前芯片平台SDK目录, 对应的SDK源代码的目录 - gPLATFORM_DIR : 当前厂商配置目录 - gHARDWARE_DIR : 当前芯片配置目录 - gCUSTOM_DIR : 当前产品型号配置目录 - gPROJECT_DIR : 存放项目的目录, 即project - gTOOLS_DIR : 工具目录 - gBUILD_DIR : 编译过程中产生的中间文件 - gINSTALL_DIR : 编译时软件项目输出的根目录 - gosROOT_DIR : 运行系统的根目录, 在编译过程中创建, 在里面的所有文件及目录都被放到目标系统上去 - gosPRJ_DIR : 运行系统的下的存放项目资源的目录, 在编译过程中创建, 所有项目资源都在此目录下 #### 常用的文件宏 - gMAKEFILE_CFGFILE : Makefile配置文件, 可用于定义一些编程过程中都要用到的全局宏 ------ ## 编译固件的方法 1. 编辑顶层目录下的Makefile, 修改gBOARDID宏的值为要编译的产品完整型号(包含厂商标识、芯片标识、产品型识、定制标识) 2. 在顶层目录下输入make dep;make后回车即可开始编译 3. 编译完成后在顶层目录下的build目录下会产生对应的.zz结尾的固件升级包 4. 通过产品的网页中 系统=>软件管理=>软件更新 升级即可 ------ ## 运行系统管理 1. 运行系统内的管理是通过对项目中组件的操作来实现的 2. 多个相关或类似的组件组成一个项目 3. 项目内可能包含各种文件, 但对于外界来说是一个整体, 通过其下的组件提供统一的交互接口 5. 每个组件都可以有配置及接口 6. 用户对于项目的知识可以只限于组件的配置及接口的使用即可, 组件内部的实现细节不用关心 7. 通过telnet/ssh或调试口可以连接到产品的运行系统中, 输入正确的用户名及密码将进入终端 8. 终端命令简介 - ? ------------------------------------------ 列出所有项目组件 - 组件名 ----------------------------------- 列出组件的配置 - 组件名:属性 ---------------------------- 显示组件配置内某项属性的值 - 组件名:属性=值 ----------------------- 设置组件配置内某项属性的值 - 组件名. ---------------------------------- 列出组件的接口 - 组件名.接口名 ------------------------- 调用组件的接口 - 组件名.接口名[ 参数1, 参数2, ... ] - 调用组件的接口, 并给出参数 ---- ## 名词解释 #### 顶层目录 此文件存在的目录即为顶层目录, 也是整个SDK的最高层目录 #### 项目 * 所有的应用都以项目的形式存在, 项目以目录的方式放在project目录下, 每一个项目目录中都必须包含: - 项目信息文件, 即prj.json - 项目编译Makefile, 使用Openwrt的编译体系 * 每一个项目目录中都可包含: - 可执行程序代码 - 库代码 - 内核驱动代码 - 组件源代码 - 默认配置文件 - 界面文件 - 语言文件 - 脚本文件及其它资源文件 * 所有的开发者都应以项目的方式开发自已的应用程序 *在fpk.md中有对项目及FPK安装包有更详细的介绍* #### 项目目录 每一个项目都有一个项目名同名的目录, 用来存放项目相关的资料, 通常放在顶层目录下的project目录中 #### FPK安装包 * FPK安装包即相当于windows中的软件安装包, 安卓中的apk文件 * 项目开发完成后将编译成FPK安装包安装到系统中 * 项目在编译后会生产以fpk结尾的FPK安装包 * FPK安装包可以通过系统界面安装到系统中 * 每一个FPK安装包中都必须包含: - 项目信息文件, 即prj.json * 每一个FPK安装包都可包含: - lib下的库 - bin下的可执行文件 - 驱动文件 - .com结尾的组件文件 - .cfg结尾的配置文件 - .html结尾的界面文件 - .json结尾的语言文件 - .sh结尾的SHELL脚本文件 - 其它的资源文件 - install/include下开发用的库头文件(SDK编译时用到) - install/lib下开发用的库(SDK编译时用到) #### 组件 * 位于项目中, 使用C代码开发, 与Linux下的普通程序一样,可包含linux下的头文件调用Linux的库 * 项目的所有功能接口都以组件的方式实现, 放在对应的项目目录下 * 组件提供统一接口方便其它模块或用户管理及使用 * 组件跟普通的可执行程序的区别是有多个入口, 会被其它程序调用, 提供统一的接口, 系统对其有统一的管理方式 * 组件有对应的配置属性, 是一个JSON对象, 其掉电后可保存 * 开发者也可以以传统的可执行程序的方式开发应用, 但必须以组件的形式开发对应的接口以方便与其它项目或系统管理层交互 #### 运行系统: 即编译出来后的映像在目标机器上运行时的系统 ------ ## 系统分层简介 组件存在于项目中, 相似功能的组件或是相互配合的功能组件通常归类到一个项目中, 对于系统来说组件是核心部件, 项目只是组件的容器, 以下以组件视角将系统从上到下分为五层 #### 第五层 * 第三方应用组件, 用户自行开发各种应用组件, 如: - ddns@phddns的花生壳客户端 - ddns@oray的花生壳内网版客户端 - portal@wifidog的wifidog的客户端 - printer@p910nd网络打印机 * 常用应用组件, 系统中常用的功能, 通常固件会集成与产品特性相关的一些此类组件, 如: - vpn@pptpclient的PPTP客户端 - uart@dtu串口透传组件 - gnss@gps全球定位系统组件 * 基础应用组件,系统运行中经常被调用的组件, 通常会集成在固件中, 如: - tui@dropbear的SSH服务器 - tui@telnet的Telnet服务器 - wui@admin的WEB管理服务器 - clock@date时间管理组件 - network@frame网络管理组件 - land@syslog日志管理组件 #### 第四层 * 框架基础组件, 基于框架库或是一些C库开发的框架必须的组件, 如: - land@serivce服务进程组件 - land@joint事件组件 - land@fpk包管理组件 - land@auth用户管理组件 - land@machine设备信息管理组件 * 平台底层组件, 通过这些组件统一与底层硬件的接口, 通常移植到新的平台时只需要重新开发此类组件即可, 如: - arch@data配置管理组件 - arch@firmware固件管理组件 - arch@reggpio IO口操作组件 - arch@ethernet网口组件 - wifi@nssid无线2.4G SSID组件 #### 第三层 * 系统框架库, 如: land库, landnet库, uart库, modem库 * 系统框架工具, 如: he, hetui #### 第二层 * Linux优秀的应用程序, 如: openvpn, pptpclient, proftpd, samba等 * Linux常用的应用及工具, 如: busybox, wget, mtd, ip, tc等 * Linux C库及一些常用基础库或应用库, 如: libc库, math库, json库, zlib库, openssl库 #### 第一层 * Linux内核驱动或内核驱动模块 * Linux内核 ------ ## 运行系统中创建脚本项目 #### SSH或Telnet进入系统终端 如在Windwos下使用Telnet工具或是SSH客户端(如需中文支持必须工具支持UTF8编码)进入运行系统 ``` telnet 192.168.8.1 A218E-123450 login: admin Password: EEEEEEEEE LL FFFFFFFFF EE LL FF EE LL FF EEEEEEEEE LL FFFFFFFFF EE LL FF EE LL FF Ashy EEEEEEEEE LLLLLLLLLL FF ----------------------------------------------------------- Command Help ----------------------------------------------------------- ? ----------------------- List all the project . ----------------------- List all the dynamic component ------------------- Show configure by component . ------------------ List all the function by component : ---------- Show the value by component option := -- Set the value to component option ----------------------------------------------------------- # ``` 以上示例中设备的地址为192.168.8.1, 出现以上提示表示已进入系统终端 #### 进入SHELL终端 在系统终端中输入elf回车即可进入SHELL终端 ``` # elf BusyBox v1.22.1 (2019-12-09 13:35:33 CST) built-in shell (ash) Enter 'help' for a list of built-in commands. ~ # ``` #### 查看FPK指令相关说明 在SHELL终端执行如下指令查看相关的命令说明 ``` ~ # he fpk. { "cfg_install[ project dir, ... ]":"install project configure file", "register[ project dir, ... ]":"register proejct to system", "install[ project dir|fpk, ... ]":"install project", "uninstall[ project name ]":"uninstall project", "list[ [project name] ":"list project infomation", "wui_list":"list all the project webpage", "preset[ project, project name ]":"create a project template", "preset[ check, project name ]":"check the a project json format", "preset[ init, project name, init level, call ]":"register a component api at system init call", "preset[ uninit, project name, uninit level, call ]":"register a component api at system shutdown call", "preset[ joint, project name, joint level, call ]":"register a component api at joint cast", "preset[ wui, project name, wui name ]":"create a ace web page template for com" } ~ # ``` 以下主要需要用到的指令为preset #### 在运行系统中创建项目 执行 ``` he fpk.preset[ project, 项目名 ] ``` 创建项目, 以下以创建mytest项目为示例 ``` ~ # he fpk.preset[ project, mytest ] project mytest introduction: my first test project ~ # ``` 执行 ``` he fpk.list[ 项目名 ] ``` 查看项目的基本信息, 以下查看刚创建的mytest项目 ``` ~ # he fpk.list[ mytest ] { "name":"mytest", "version":"internal", "author":"fpk.preset", "intro":"my first test project", "path":"/mnt/internal/prj/mytest", "size":"114" } ~ # ``` 以上显示为一个JSON表示mytest项目的基本信息, 如path属性指明项目所在的位置, size表示项目的大小 #### 在项目中创建SHELL脚本(如需创建其他脚本文件需要确认系统是否支持) 进入项目目录创建SHELL脚本文件, 如下示例 ``` ~ # cd /mnt/internal/prj/mytest /mnt/internal/prj/mytest # vi myshell.sh #!/bin/sh # read the configure( the configure name is testc, in the mytest project ) status=`he mytest@testc:status` # log the infomation logger =====mytest@testc status is ${status}=========== ``` 编辑保存好SHELL文件后,将SHELL文件的权限改为可执行 ``` /mnt/internal/prj/mytest # chmod a+rwx myshell.sh ``` #### 在项目中注册启动项 以上创建的脚本文件如需要启动时执行即需要注册启动项, 通过执行 ``` he fpk.preset[ init, 项目名, 启动级别, 脚本全路径 ] ``` 注册启动项, 接以上示例将myshell.sh注册为初始化app(启动级别为app)时启动 ``` /mnt/internal/prj/mytest # he fpk.preset[init,mytest,app, /mnt/internal/prj/mytest/myshell.sh ] ``` 使用fpk.list来查看项目信息是否发生变化 ``` /mnt/internal/prj/mytest # he fpk.list[mytest] { "name":"mytest", "version":"internal", "author":"fpk.preset", "intro":"my first test project", "init": { "app":"/mnt/internal/prj/mytest/myshell.sh" }, "path":"/mnt/internal/prj/mytest", "size":"243" } /mnt/internal/prj/mytest # ``` 可以看到项目中有增加了init的属性即表示注册启动项成功, 如重启后此SHELL脚本将会在系统引导app级别时运行 *注: 所有注册开机运行及关机运行的脚本必须在执行完后应立即退出,否则将使系统的程序开关机流程停在未退出的程序中* #### 在项目中注册关机项 如需要关机时执行即需要注册关机项, 通过以下指令注册 ``` he fpk.preset[ uninit, 项目名, 关机级别, 脚本全路径 ] ``` #### 在项目中注册系统事件 通过注册系统事件让系统在事件发生后运行指定的脚本, 通过执行 ``` he fpk.preset[ joint, 项目名, 事件名称, 脚本全路径 ] ``` 注册系统事件 *注: 系统中有很多事件, 也可以自定义事件, 具体介绍在joint.md中* *注: 所有事件处理脚本必须在执行完后应立即退出,否则将使系统的事件流程停在未退出的程序中* #### 在项目中创建默认配置 我们可为项目创建默认配置, 在SHELL脚本中通过he执行来获取配置, 并在之后生成网页界面中让用户通过网页界面来修改配置以实现用户配置SHELL的运行, 如下我们在mytest项目中创建testc配置, 即项目目录下创建一个配置同名的.cfg文件 ``` /mnt/internal/prj/mytest # vi testc.cfg { "status":"enable", "property":"my test value" } ``` testc.cfg文件的内容即是mytest@testc的默认配置, 重启后即可通过he mytest@testc来读取 *注:默认配置文件一定要严格符合JSON格式* 我们还可以通过 ``` he fpk.preset[check,项目名] ``` 来检查项目的所有的JSON格式是否正确, 如果不正确就会报错, 如我们检查mytest项目执行如下 ``` /mnt/internal/prj/mytest # he fpk.preset[check,mytest] ``` #### 在项目中生成网页界面 执行 ``` he fpk.preset[ wui, 项目名, 界面标识 ] ``` 生成网页界面, 比如接上面的示例项目名为mytest, 界面ID也名命为testc, 那么执行如下: ``` /mnt/internal/prj/mytest # he fpk.preset[ wui, mytest, testc ] web menu title(Chinese): testc设置 web menu name(English): testc Settings { "page":"testc.html", "lang": { "cn":"testc-cn.json", "en":"testc-en.json" }, "cn":"testc设置", "en":"testc Settings" } ``` 执行后会交互式的询问菜单的中英文名称(在管理网页中的应用菜单下显示的入口名, 中文必须会UTF8编码), 输入后会在mytest的项目目录下产生三个文件: - testc.html 界面文件 - testc-cn.json 中文语言文件 - testc-en.json 英文语言文件 *注:使用中文名称或中文语言时系统一定要设为UTF8的编码, 否则将无法工作* 之后编辑对应的html界面即可, 接以上示例所生成的testc.html中是一个简单的示例, 包含了获取及设置mytset@testc配置 编写网页需要有javascript、html的基本知识,并稍了解jquery的用法即可,具体的界面开发后面会写专门的文档来说明 *注:以上网页界面可以实时在管理网页的<应用>下面对应的入口名访问, 如以上示例的中文入口为* #### 打包运行系统中创建的项目 执行 ``` he fpk.preset[ pack, 项目名 ] ``` 将项目打包为FPK安装包, 打包成FPK安装包后即可通过管理界面安装到其它的设备中, 比如接上面的示例项目名为mytest, 那么执行如下打包: ``` /mnt/internal/prj/mytest # he fpk.preset[pack,mytest] The packaging is located in this /tmp/mytest-internal-mt7621.fpk /mnt/internal/prj/mytest # ``` 打包生成的FPK安装包可通过tftp或其它的网络协议传送出来, 然后可以通过管理界面升级到其它设备中 #### 删除运行系统中的项目 执行 ``` he fpk.preset[ delete, 项目名 ] ``` 将删除以项目名名命的项目 也可在管理网页界面中的<系统>下<软件管理>中删除对应的软件 还可以在<系统>下<软件管理>中直接恢复出厂时的软件来删除所有的后面安装的软件及对应的配置 ------ ## 在SDK中开发项目简介 #### 创建项目 在顶层目录下执行 ``` ./tools/fpk-preset project <项目名> ``` 提示输入相关的项目简介后即可在project目录下生成<项目名>同名的项目, 如要创建项目myprj执行如下: ``` ./tools/fpk-preset project myprj project myprj introduction: my first project ``` #### 创建项目内的组件 在顶层目录下执行 ``` ./tools/fpk-preset com <项目名> <组件名> ``` 提示输入相关的组件简介后即可在<项目名>对应的项目目录中生成一个<组件名>同名的目录, 里面有对应<组件名>同名的.c文件, 此文件为组件框架代码及简单的示例,同时会在项目目录下生成<组件名>同名的.cfg文件(组件默认配置), 如要在项目myprj下创建testc组件执行如下: ``` ./tools/fpk-preset com myprj testc component testc introduction: test the com program ``` #### 编辑组件代码实现功能 在组件代码中修改启动函数_setup(对应setup接口)或服务函数_service(对应service接口)实现你要的功能, 组件框架代码的示例是 一个间隔10秒记录日志的 的示例功能 *注: 组件中所有的接口对应的实际函数就是接口名前加下划线前缀, 如setup接口对应的就是_setup函数, 调用setup接口时将调用到_setup函数* #### 注册开机运行 在顶层目录下执行 ``` ./tools/fpk-preset init <项目名> <启动级别> <组件全名>.<初始化函数> ``` 此指令的功能是将组件接口设置为开机自动运行, 比如接上面的示例要使testc组件中的setup接口(对应的函数为_setup)在开机启动app时运行, 那么执行如下: ``` ./tools/fpk-preset init myprj app myprj@testc.setup ``` *注: 所有注册开机运行及关机运行的程序或是函数必须在执行完后应立即退出,否则将使系统的程序开关机流程停在未退出的程序或函数中* #### 注册关机运行 在顶层目录下执行 ``` ./tools/fpk-preset uninit <项目名> <关机级别> <组件全名>.<关闭函数> ``` 此指令的功能是将组件接口设置为关机自动运行, 比如接上面的示例要使testc组件中的shut接口(对应的函数为_shut)在关机关闭app时运行, 那么执行如下: ``` ./tools/fpk-preset uninit myprj app myprj@testc.shut ``` *注: 系统开机级别跟开机级别的介绍在init.md中* #### 注册系统事件 在顶层目录下执行 ``` ./tools/fpk-preset joint <项目名> <事件名称> <组件全名>.<处理函数> ``` 此指令的功能是将组件接口注册为某一个事件的处理函数, 当事件发生时此函数即会被调用, 以下接上面的示列将testc的take函数注册成网络上线时调用: ``` ./tools/fpk-preset joint myprj network/online myprj@testc.take ``` *注: 系统中有很多事件, 也可以自定义事件, 具体介绍在joint.md中* *注: 所有事件处理函数或程序必须在执行完后应立即退出,否则将使系统的事件流程停在未退出的程序或函数中* #### 调用系统组件 使用com_call()系列的函数可以调用其它组件的接口, com_call系列函数的使用在doc/dev目录中 #### 生成组件界面 在顶层目录下执行 ``` ./tools/fpk-preset wui <项目名> <界面ID> ``` 比如接上面的示例项目名为myprj, 界面ID也名命为testc, 那么执行如下: ``` ./tools/fpk-preset wui myprj testc web menu title(Chinese): testc设置 web menu name(English): testc Settings { "page":"testc.html", "lang": { "cn":"testc-cn.json", "en":"testc-en.json" }, "cn":"testc设置", "en":"testc Settings" } ``` 执行后会交互式的询问菜单的中英文名称(在管理网页中的应用菜单下显示的入口名), 输入后会在myprj的项目目录下产生三个文件: - testc.html 界面文件 - testc-cn.json 中文语言文件 - testc-en.json 英文语言文件 *注:使用中文名称或中文语言时系统一定要设为UTF8的编码, 否则将无法工作* #### 修改界面 修改对应的html界面即可, 接以上示例所生成的testc.html中是一个简单的示例, 包含了获取及设置myprj@testc组件配置 修改网页需要有javascript、html的基本知识,并稍了解jquery的用法即可,具体的界面开发后面会写专门的文档来说明 #### 更新项目选项菜单 在顶层目录下执行 ``` make menu ``` 新创建的项目需要执行此指令才可以在项目选项菜单的显示出来 #### 勾选项目 在顶层目录下执行 ``` make menuconfig ``` 在进入Farm system菜单选项后勾选指定的项目即可, 接以上示例进入Farm system菜单后勾选myprj项目即可 #### 把项目编译成FPK安装包 在顶层目录下执行 ``` make OBJ=<项目名> ``` 比如编译myprj项目时执行 ``` make OBJ=myprj ``` 编译完成后会在build目录下生成一个myprj开头, 点fpk结尾的FPK安装包 #### 安装FPK 通过在网页界面中的 系统=》软件管理=>软件更新 来安装FPK包 #### 测试FPK包 - 通过网页界面升级后会提示重启, 重启后可以在网页界面的应用中看到对应的菜单 - 在软件列表中看对应的项目 - 通过终端命令行执行问号可以看到对应组件 - 通过终端命令行也可以直接调用组件的接口及对组件配置做增删改查 - 可以通过日志看到组件记录的日志 #### 重新编译FPK 当修改过项目的代码或是资源文件后需要重新编译可输入 ``` make OBJ=<项目名> clean ``` 清理编译的中间文件后再执行编译即可 接以上示例重新编译myprj项目输入如下 ``` make OBJ=myprj clean make OBJ=myprj ``` ------ ## 如何使编译的固件自带指定的项目 #### 更新项目选项菜单 在顶层目录下执行 ``` make menu gBOARDID=产品完整型号 ``` 新创建的项目需要执行此指令才可以在项目选项菜单的显示出来 #### 勾选项目 在顶层目录下执行 ``` make menuconfig gBOARDID=产品完整型号 ``` 在进入Farm system菜单选项后指定的项目即可 #### 编译固件 在顶层目录下执行 ``` make dep gBOARDID=产品完整型号 make gBOARDID=产品完整型号 ``` 编译完成后会在build目录下生产一个.zz结尾固件升级包 #### 更新固件 通过在网页界面中的 系统=>软件管理=>软件更新 来点选.zz结尾的固件升级包来更新固件 ---- ## 附1: 在SDK的项目中编写Linux C/C++程序 #### 创建项目内的Linux程序 在顶层目录下执行 ``` ./tools/fpk-preset exe <项目名> ``` 提示输入相关的程序简介后即可在<项目名>对应的项目目录中生成一个同名的目录, 里面有对应同名的.c文件简单的示例, 如要在项目myprj下创建opentest程序执行如下: ``` ./tools/fpk-preset exe myprj opentest execute opentest introduction: test the classic linux program ``` #### 编辑代码实现功能 在同名的目录下直接辑编同名的.c文件即可, 并且在此目录下增加.c的文件都会被自动编译并产生的可执行程序, 如果对Makefile比如熟悉,也可自行修改目录下的Makefile文件(如果实现C++的程序的编译需要自行修改Makefile文件) #### 编译及安装 见以上开发项目简介 #### 在运行系统中调试运行Linux程序 通过Telnet/ssh或终端串口进入终端命令行执行如下 ``` +<项目名>/ ``` 此指令将运行〈项目名>下的, 比如接上面的示例要运行myprj项目的Linux程序opentest, 那么执行如下: ``` +myprj/opentest ``` #### 让Linux程序开机运行 在顶层目录下执行 ``` ./tools/fpk-preset init <项目名> <启动级别> +<项目名>/ ``` 此指令的功能是将Linux可执行程序设置为开机自动运行, 比如接上面的示例要使opentest在开机启动app时运行, 那么执行如下: ``` ./tools/fpk-preset init myprj app +myprj/opentest ``` *注: 所有注册开机运行的程序或是函数必须在执行完后应立即退出,否则将使系统的程序开机流程停在未退出的程序或函数中* #### 在组件中运行项目的Linux程序 在组件代码中通过两个接口实现运行项目下的Linux程序 1. 获到项目下Linux程序的路径, 函数原型如下: ``` /** * @brief 得到项目对应的Linux程序的路径 * @param buffer 返回信息缓冲区 * @param buflen 缓冲区大小 * @param project 项目名称, 为空表示当前项目 * @param binformat 程序名称 * @return 返回程序路径*/ const char *project_bin_path( char *buffer, int buflen, const char *project, const char *binformat, ... ); ``` 2. 运行Linux程序, 函数原型如下: ``` /** * @brief 与system()相同, 在系统下会比system()函数更安全 * @param format 命令 * @return 成功返回所调用的命令返回的值 */ int shell( const char *format, ... ); ``` 3. 示例获到并运行myprj项目下opentest程序 ``` /* 定义存入linux程序路径的空间 */ char path[PATHNAME_SIZE]; /* 获到路径 */ project_bin_path( path, sizeof(path), "myprj", "opentest" ); /* 运行 */ shell( path ); ```