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

网友投稿 831 2022-05-29

摘要:本篇帖子向大家讲述如何添加和修改一些函数到我们自己的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

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

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

轻量级操作系统 LiteOS

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:PostgreSQL如何删除不使用的xlog文件
下一篇:俄罗斯方块源码分享 html+css+js
相关文章