STM32L476移植华为LiteOS系列教程---main.c 8

举报
樊心昊 发表于 2020/05/12 12:07:09 2020/05/12
【摘要】 摘要:本篇帖子向大家讲述如何添加和修改一些函数到我们自己的main.c文件中,最终使LiteOS及其组件运行起来,也是本连载贴的完结篇吧!一、照葫芦画瓢---详解iot_link/targets/STM32L431_BearPi/Src/main.c文件1234567891011121314151617181920212223242526272829303132333435363738394...

摘要:本篇帖子向大家讲述如何添加和修改一些函数到我们自己的main.c文件中,最终使LiteOS及其组件运行起来,也是本连载贴的完结篇吧!

一、照葫芦画瓢---详解iot_link/targets/STM32L431_BearPi/Src/main.c文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "main.h"    
#include "sys_init.h"    
#include "mem.h"    
#include "los_base.h"    
#include "los_task.ph"    
#include "los_typedef.h"    
#include "los_sys.h"    
#if defined (__CC_ARM)                                            
extern  char  Image$$RW_IRAM1$$ZI$$Limit [];    
extern  char  Image$$ARM_LIB_STACKHEAP$$Base [];    
#elif defined (__GNUC__) 
/* 我们使用IoT Studio默认是GNUC编译环境,所以用该预处理项 
  * 该处引入了两个变量__los_heap_addr_start__和__los_heap_addr_end__,这两个变量定义在os.ld文件中,想知道详细定义的可以移步到
  *“0x04使用IoT-Studio移植LiteOS到STM32L476(也可以是其他芯片)---修改链接脚本” 
  */   
extern  char  __los_heap_addr_start__ [];    
extern  char  __los_heap_addr_end__ [];    
#else    
#error "fix me"    
#endif    
/* 以下代码就将一段物理内存开始地址和结束地址映射为一个名为system_phys_mem的结构体数组
  * 这段内存将来给LiteOS分配使用
  */
const  struct  phys_mem system_phys_mem [] =    
{    
#if defined (__CC_ARM)    
{ Image$$RW_IRAM1$$ZI$$Limit, Image$$ARM_LIB_STACKHEAP$$Base },    
#elif defined (__GNUC__)    
{(unsigned  long ) __los_heap_addr_start__,(unsigned  long ) __los_heap_addr_end__ },    
#else    
#error "fix me"    
#endif    
{ 0, 0 }    
};    
/* 该函数用于初始化开发板特有的外设,例如LCD显示器、温湿度采集器等等,移植时可以将你的开发板的特有外设的初始化函数在此替换
  *
  */
VOID  HardWare_Init( VOID )    
{    
     HAL_Init();    
     /* Configure the system clock */    
     SystemClock_Config();    
     MX_GPIO_Init();    
     MX_I2C1_Init();    
     MX_SPI2_Init();    
     dwt_delay_init(SystemCoreClock);    
     LCD_Init();                     
     LCD_Clear(BLACK);    
     POINT_COLOR = GREEN;    
     LCD_ShowString(10, 50, 240, 24, 24,  "Welcome to BearPi!" );    
     LCD_ShowString(20, 90, 240, 16, 16,  "BearPi-IoT Develop Board" );    
     LCD_ShowString(20, 130, 240, 16, 16,  "Powerd by Huawei LiteOS!" );    
     LCD_ShowString(30, 170, 240, 16, 16,  "Connecting NET......" );    
}    
/* 导入Demo的函数link_main,该函数的定义在iot_link/link_main.c中
  * 该函数中根据我们的条件编译宏来选择使能哪些组件(定时器、网络、各类Demo)最终调用standard_app_demo_main();启动特定Demo中的任务
  * 大家可以进到Demo文件夹下,每个Demo中都有这个standard_app_demo_main();函数的定义,这就是统一接口接口化编程的实例
  */
extern  int  link_main( void  *args);    
/* 该函数用于初始化我们的第一个任务,也就是link_main,我们需要初始化自己的任务可以照着仿写
  *
  */
static  int  link_test()    
{    
int  ret = -1;    
UINT32  uwRet = LOS_OK;    
UINT32   handle;    
TSK_INIT_PARAM_S task_init_param;                                             //定义一个task_init_param结构体变量,用于传递任务参数
memset  (&task_init_param, 0,  sizeof  (TSK_INIT_PARAM_S));    
task_init_param.uwArg = (unsigned  int )NULL;    
task_init_param.usTaskPrio = 2;                                                     //设置任务优先级
task_init_param.pcName =( char  *)  "link_main" ;                             //设置任务名称
task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)link_main;     //设置任务入口函数,这就是上面引入的那个函数
task_init_param.uwStackSize = 0x1000;                                         //设置任务栈大小,这个任务栈将在__los_heap_addr_start__到__los_heap_addr_end__之间的内存中分配
uwRet = LOS_TaskCreate(&handle, &task_init_param);                 //创建任务
if (LOS_OK == uwRet){    
ret = 0;    
}    
return  ret;    
}    
int  main( void )    
{    
UINT32  uwRet = LOS_OK;    
HardWare_Init();    
uwRet = LOS_KernelInit();                                                             //初始化内核
if  (uwRet != LOS_OK)    
{    
return  LOS_NOK;    
}    
extern  void  shell_uart_init( int  baud);                                             //导入和初始化shell,你的开发板以上电就会自动启动shell,你可以用键盘输入一个help试试,别认为是程序坏了
shell_uart_init(115200);                                                                  //没有打印hello world
link_test();    
( void )LOS_Start();                                                                          //开启操作系统调度
return  0;                                                                                         //正常情况下永远不会运行到return 0
}

PS:大家在复制main.c到自己的工程中修改时,记得顺便将main.h也复制过去,然后就可以开始编译了,编译过程中应该会出现一些错误,大部分都是依赖文件导致的,你可以尝试将缺失的依赖文件找到,并复制到特定的文件夹中,知道解决文件,如果遇到无法解决的文件,欢迎大家给我留言和私信,留言尽量留到“汇总帖中”,便于后来的同学参考这些有价值的问题以及解决方案,感谢大家的支持!


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。