建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

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

确定
我再想想
选择版块
直达楼层
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

采纳成功

您已采纳当前回复为最佳回复

樊心昊

发帖: 172粉丝: 139

发消息 + 关注

发表于2020年04月19日 17:06:21 1212 2
直达本楼层的链接
楼主
显示全部楼层
[技术干货] STM32L476移植华为LiteOS系列教程---main.c 8

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

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

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


举报
分享

分享文章到朋友圈

分享文章到微博

采纳成功

您已采纳当前回复为最佳回复

Maykyp

发帖: 4粉丝: 0

发消息 + 关注

发表于2020年04月29日 15:04:19
直达本楼层的链接
沙发
显示全部楼层

按照汇总贴到这一步,有个疑问,新移植的LiteOS用Makefile也是需要用SDK的对吧,那么这个新创建的Makefile工程和SDK的路径应该怎么放呢。

评论
樊心昊 2020-4-29 15:07 评论

SDK是IoT Studio自动放的,目前只有内测版本,如果你着急使用,可以在Ubuntu先搭建开发环境

... 查看全部
Maykyp 2020-4-29 15:18 评论

评论 樊心昊:对,我是在Ubuntu下按照汇总贴创建了一个STM32L476的工程,创建完成后也是在Ubuntu下编译的,我现在的疑问就是,新创建的这个STM32L476工程单独就可以编译吗?汇总贴0x03步骤里面把Driver目录删除了,“iot-link SDK\drivers\third_party\ST中为我们提供了该文件夹下的所有文件,没必要保留”。所以Ubuntu下编译也是需要iot-link SDK支持的吧,这个iot-link SDK怎么和新创建的STM32L476工程联系起来。

... 查看全部
樊心昊 2020-4-30 11:47 评论

评论 Maykyp:你好,新版IoT Studio已经发布,可以尝试https://bbs.huaweicloud.com/forum/thread-53540-1-1.html

... 查看全部
点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

我是卤蛋

发帖: 121粉丝: 292

级别 : 版主,版块专家

发消息 + 关注

发表于2020年06月26日 11:14:37
直达本楼层的链接
板凳
显示全部楼层

感谢分享,持续学习~

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册

结贴

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200