1## 快速入门:开发Hello World 2快速入门通过完成经典的“Hello World”把搭建UniProton开发环境的各步骤进行实例说明,让用户更直观地初步了解如何基于UniProton进行开发。 3 4## 开发环境说明 5开发平台:cortex_m4 6 7芯片型号:stm32f407 8 9OS版本信息:UniProton 22.03 10 11集成开发环境:UniProton-docker 12 13### 实现过程 14以helloworld demo为例:[demo目录结构](../demos/helloworld/readme.txt) 15<ol> 16<li>进入到用户的工作目录,这里假设为/workspace/UniProton。</li> 17<li>将UniProton的源码放在/workspace/UniProton目录下。</li> 18<li>参考[编译指导](./UniProton_build.md) 准备编译环境以及libboundscheck库下载。</li> 19<li>编译生成的libCortexM4.a文件在UniProton/output/UniProton/lib/cortex_m4/目录下,生成的libCortexMXsec_c.lib在UniProton/output/libboundscheck/lib/cortex_m4/目录下。将这两个静态库文件拷贝到demos/helloworld/libs目录下。</li> 20<li>将UniProton/src/include目录下的头文件拷贝到demos/helloworld/include目录下。</li> 21<li>将UniProton/src/config目录和UniProton/build/uniproton_config/config_m4目录下的文件拷贝到demos/helloworld/config目录下,并修改prt_config.c以及prt_config.h以适配用户功能,prt_config.h可配置os功能开关,按需裁剪。</li> 22<li>demos/helloworld/bsp目录下可以新增板级驱动代码,demos/helloworld/build目录下配置编译构建相关内容,examples.ld为链接文件,根据单板内存地址等修改适配。</li> 23<li>代码修改完成后,适配cmake,最后在build目录下运行sh build.sh即可在同级目录下生成helloworld可执行二进制文件。</li> 24<li>加载到单板上运行可执行文件helloworld。</li> 25</ol> 26 27### Hello World 示例程序 28在main.c文件中编写Hello World示例程序,如参考内容如下(如前所述,PRT_HardBootInit/PRT_HardDrvInit接口中添加用户自定义硬件模块初始化程序,PRT_AppInit接口中添加用户业务代码): 29```c 30#include <stdio.h> 31#include <stdlib.h> 32#include <string.h> 33#include <stdarg.h> 34#include "securec.h" 35#include "rtt_viewer.h" 36#include "prt_config.h" 37#include "prt_config_internal.h" 38#include "prt_clk.h" 39#include "test.h" 40 41void helloworld_task(U32 uwParam1, U32 uParam2, U32 uwParam3, U32 uwParam4) 42{ 43 printf("hello world!\n"); 44 while (1) { 45 PRT_TaskDelay(10); 46 } 47 48 return; 49} 50 51U32 PRT_AppInit(void) 52{ 53 U32 ret; 54 TskHandle taskPid; 55 struct TskInitParam stInitParam = {helloworld_task, 10, 0, {0}, 0x500, "TaskA", 0}; 56 57 ret = PRT_TaskCreate(&taskPid, &stInitParam); 58 if (ret) { 59 return ret; 60 } 61 62 ret = PRT_TaskResume(taskPid); 63 if (ret) { 64 return ret; 65 } 66 67 return OS_OK; 68} 69 70U32 PRT_HardDrvInit(void) 71{ 72 RttViewerInit(); 73 RttViewerModeSet(0, RTT_VIEWER_MODE_BLOCK_IF_FIFO_FULL); 74 75 return OS_OK; 76} 77 78U32 g_testRandStackProtect; 79void OsRandomSeedInit(void) 80{ 81#if defined(OS_OPTION_RND) 82 U32 ret; 83 U32 seed; 84 seed = PRT_ClkGetCycleCount64(); 85 g_testRandStackProtect = rand_r(&seed); 86 ret = PRT_SysSetRndNum(OS_SYS_RND_STACK_PROTECT,g_testRandStackProtect); 87#endif 88} 89 90void OsGlobalDataInit(void) 91{ 92} 93 94void PRT_HardBootInit(void) 95{ 96 OsGlobalDataInit(); 97 OsRandomSeedInit(); 98} 99 100U32 PRT_Printf(const char *format, ...) 101{ 102 va_list vaList; 103 char buff[0x200] = { 0 }; 104 S32 count; 105 U32 ret; 106 107 va_start(vaList, format); 108 count = vsprintf_s(buff, 0x200, format, vaList); 109 va_end(vaList); 110 111 if (count == -1) { 112 return OS_ERROR; 113 } 114 115 RttViewerWrite(0, buff, count); 116 117 return count; 118} 119 120S32 main(void) 121{ 122 return OsConfigStart(); 123} 124 125``` 126 127### 结果验证 128在docker环境中使用demos/helloworld/build/build_app.sh脚本编译整个工程后生成的可执行文件helloworld加载载到单板上运行,单板连接arm仿真器,打开jlink软件,可以在软件界面上看到输出结果如下: 129``` 130hello world! 131```