• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.libUniProton/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 示例程序
28main.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```