STM32F407移植OpenHarmony笔记6

news2024/11/15 11:16:07

继上一篇笔记,编译好STM32的裸机程序,能点亮LED灯了。
下一步就是启动liteos_m内核了。


 不过为了更好的调试代码,需要先把printf重定向到串口,基于gcc的printf重定向和Keil不一样。
直接新建printf.c,在里面重写printf函数即可。

int printf(char const *fmt, ...)
{
    char buf[256];
    va_list ap;
    va_start(ap, fmt);
    int len = vsnprintf_s(buf, sizeof(buf), sizeof(buf) - 1, fmt, ap);
    UartWrite(buf, len);
    va_end(ap);
    return len;
}

UartWrite是写串口的函数,基于HAL库写串口驱动我就不介绍了。
记得在printf之前要初始化UART和相关的GPIO。
这里有2个细节需要注意:
1.写串口没有临界区保护,多线程printf会有竞争风险,等kernel跑起来了,到时候加上mutex。
2.格式化字符串的buf长度256,是在stack上开辟的,注意调用线程的stack空间要给够。


liteos_m内核已经完成了ARM cortex-m4的适配,理论上所有基于cortex-m4的MCU都能快速使用。
我们只需要在main函数调用LOS_KernelInit()和LOS_Start()可以了。
启动之前自己创建一个线程,用来闪灯。

static void LED_Blink(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	__HAL_RCC_GPIOA_CLK_ENABLE();
	GPIO_InitStruct.Pin = GPIO_PIN_4;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	GPIO_InitStruct.Alternate = 0;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    printf("enter led blink.\n");
	while(1)
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		LOS_TaskDelay(250);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
		LOS_TaskDelay(250);
	}
}

static void InitTask(void)
{
    UINT32 taskID = 0;
    TSK_INIT_PARAM_S stTask = {0};
    stTask.pfnTaskEntry = (TSK_ENTRY_FUNC)LED_Blink;
    stTask.uwStackSize = 1024;
    stTask.pcName = "led";
    stTask.usTaskPrio = 1;
    LOS_TaskCreate(&taskID, &stTask);
    printf("task id=%d\n", taskID);
}

int main(void)
{
	HAL_Init();
	SystemClock_Config();
	UartInit();
	printf("init...\n");
	LOS_KernelInit();
	InitTask();
	LOS_Start();
    printf("BUG!!!\n");
	while(1);
}

运气好的话,编译下去,可以看到串口打印,同时LED也会闪烁。

init...
entering kernel init...
task id=2
Entering scheduler
enter led blink.

如果没有跑起来的话,可以检查一下:

1. 进入kernel/liteos_m目录,执行make menuconfig
试试修改相关配置项。

2. 检查LOSCFG_PLATFORM_HWI有没有定义为1
liteos_m有接管中断向量表的功能,需要开启这个宏。
这样一来我们就不用修改startup.s里面的中断向量函数。

3.检查printf函数能不能正常工作
printf不正常好像也会影响程序运行。


内核跑起来之后,我们可以开启shell控制台。
这个控制台是liteos_m提供的,需要手动开启,里面有几个基本命令。

开启配置后,在main函数里面调用shell初始化:

LosShellInit();
OsShellInit();
//注册自定义的命令reboot使实现重启功能
osCmdReg(CMD_TYPE_EX, "reboot", 0,(CMD_CBK_FUNC)cmd_reboot); 

static void cmd_reboot(UINT32 argc, const CHAR **argv)
{
    printf("reboot...\n");
    HAL_NVIC_SystemReset();
}

初始化完了还不能用,还要提供一个串口读取字符串的函数:uint8_t UartGetc(void)
这个函数从串口返回1个字符,没有收到数据时返回0。

光是这样还不行,它还需要我们在串口中断里面发送一个信号:
LOS_EventWrite(&g_shellInputEvent, 0x1);
g_shellInputEvent是在shell代码里面定义的全局变量,用来阻塞shell线程。
当收到g_shellInputEvent事件后,shell线程调用UartGetc来接收输入。

由于liteos_m接管了中断向量表,所以我们UART的中断函数要用:
LOS_HwiCreate(USART1_IRQn, 0, 1, (HWI_PROC_FUNC)uart_irq, 0);
这个函数来注册。

好了,终于写好代码,我们编译下载,不出意外可以看到串口打印.
输入help可以看到命令列表。

init...
entering kernel init...
task id=3
Entering scheduler
enter led blink.
OHOS # 
OHOS # 
OHOS # help
*******************shell commands:*************************

cat      cd       cp       date     free     help     ls       memusage 
mkdir    pwd      reboot   rm       rmdir    task     touch    
OHOS # 
OHOS # reboot
reboot...
init...
entering kernel init...
task id=3
Entering scheduler
enter led blink.
OHOS # 

试了下mkdir、ping等命令都不能用,下一步要实现文件系统和网络,让这几个命令正常工作。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1423000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

摄像头监控系统/视频监控云平台EasyCVR接入单兵设备后如何配置移动规矩

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体控可实现视频监控直播、视频轮播、视频录像…

C#学习笔记_类(Class)

类的定义 类的定义是以关键字 class 开始,后跟类的名称。类的主体,包含在一对花括号内。 语法格式如下: 访问标识符 class 类名 {//变量定义访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;......//方…

氢气泄漏检测仪使用方法:守护安全,从细节开始

随着科技的发展,我们的生活和工作环境中充满了各种潜在的危险。其中,氢气作为一种清洁能源,其使用日益广泛,但同时也带来了泄漏的风险。为了确保我们的安全,了解并正确使用氢气泄漏检测仪至关重要。下面将详细介绍氢气…

yum一直出现正在尝试其它镜像... 解决方法

更改yum镜像源地址为阿里云镜像即可 1. 去ail云yum镜像源官网 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) 2. 选择自己对应的操作系统这里以centos7演示: 3. 先备份原yum配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Ce…

OC源码 - FailureDetectionPeriodBlockMinutes参数解读

FailureDetectionPeriodBlockMinutes 看看官方文档中对该参数如何描述 orchestrator will detect failures to your topology, always. As a matter of configuration you may set the polling frequency and specific ways for orchestrator to notify you on such detectio…

Selenium处理Alert弹窗

页面弹窗有 3 种类型: alert(警告信息) confirm(确认信息) prompt(提示输入) 对于页面出现的 alert 弹窗,Selenium 提供如下方法: 序号 方法/属性 描述 1 ac…

【Delphi】IDE 工具栏错乱恢复

由于经常会在4K和2K显示器上切换Delphi开发环境(IDE),导致IDE工具栏错乱,咋样设置都无法恢复,后来看到红鱼儿的博客,说是通过操作注册表的方法,能解决,试了一下,果真好用,非常感谢分…

Linux split命令 切割文件

目录 一. 主要配置项二. 按照行数切割文件三. 按照指定大小切割文件 一. 主要配置项 ⏹将文件按照行数或者大小切割为若干份小文件,主要作用就是用来切割文件 -l:表示将文件按照行分割-d:表示使用数字作为分割后的文件名后缀, 而不是默认的…

java生成dll,并利用c语言使用libcurl调用http接口

本文可能需要使用的环境和工具: c/ c和GCC编译器 (Windows) Cygwin或MinGW 本文运行环境为windows10,使用MinGW-W64-builds-4.2.0 curl-8.5.0 libcurl 可以在官网 http://curl.haxx.se/ 获得。 配置MinGW 将mingw.rar解压到D:,修改系统…

软件压力测试:探究其目的与重要性

随着软件应用在各行各业中的广泛应用,确保软件在高负载和极端条件下的稳定性变得至关重要。软件压力测试是一种验证系统在不同负载条件下的性能和稳定性的方法。本文将介绍软件压力测试的目的以及为什么它对软件开发和部署过程至关重要。 验证系统性能的极限&#x…

C#: 软件任务栏托盘图标添加关闭软件菜单等

说明:在软件在任务栏右下角的系统托盘的图标添加个右键弹出菜单功能,案例实现右键弹窗菜单关闭软件功能。 1.添加系统托盘图标控件 NotifyIcon 2.右键打开控件属性菜单添加鼠标点击事件函数 3.事件函数添加代码 //右键点击任务栏图标弹出关闭菜单 priv…

python爬虫之豆瓣首页图片爬取

网址:https://movie.douban.com/ import requests from lxml import etree import re url https://movie.douban.com headers {User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/5…

【Java-JDK】JDK 的安装与环境变量的配置:Windows Linux

【Java-JDK】JDK的安装与环境变量的配置:Windows & Linux 1)Windows安装JDK1.1.下载JDK1.1.安装JDK1.2.JDK环境配置1.3.验证环境变量是否配置成功 2)Linux安装JDK2.1.下载JDK2.2.安装JDK2.3.JDK环境配置2.4.验证环境变量配置是否成功 1&a…

OpenFeign认证上下文信息的传递

基本思路 其中网关部分不是本章讨论的范围,网关处理与后续服务的处理类似。 发送处理:将认证信息植入到请求信息中接收处理:从请求头中获取到认证信息,并解析为用户信息,供后续业务使用。有两个思路: 将认证信息放到请求头中,向下传递。这种方式适用于用户认证上下文中信…

githacker安装详细教程,linux添加环境变量详细教程(见标题三)

笔者是ctf小白,这两天也是遇到.git泄露的题目,需要工具来解决问题,在下载和使用的过程中也是遇到很多问题,写此篇记录经验,以供学习 在本篇标题三中有详细介绍了Linux系统添加环境变量的操作教程,以供学习 …

242. 有效的字母异位词(力扣)(C语言题解)

✨欢迎来到脑子不好的小菜鸟的文章✨ 🎈创作不易,麻烦点点赞哦🎈 所属专栏:刷题 我的主页:脑子不好的小菜鸟 文章特点:关键点和步骤讲解放在 代码相应位置 前提: 看本文章之前,建…

【期末】openGL基础知识+编程题

头文件的使用 若应用程序使用OpenGL核心函数&#xff0c;应包括头文件<gl/gl.h> 使用GLU库函数&#xff0c;应包括头文件<gl/glu.h> 使用AUX库函数&#xff0c;应包括头文件<gl/glaux.h> 使用WGL和Win32应包括头文件<windows.h>基本程序结构 1.定…

uniCloud快速上手

uniCloud快速上手 hello uniCloud Hello uniCloud&#xff0c;是一个示例&#xff0c;演示了 uniCloud 的各种能力。 体验示例 这个示例目前只发布了h5版本和Android app版。 Hello uniCloud部署了2套&#xff0c;分别连接uniCloud的阿里云版和腾讯云版。 h5版地址&#x…

abap_bool 类型

abap_bool 类型 abap_bool 有两种abap_true和abap_false&#xff0c;abap_true代表x&#xff0c;abap_false是空

林浩然的编程奇遇记:从“单词精灵”到“英语全能小助手”

林浩然的编程奇遇记&#xff1a;从“单词精灵”到“英语全能小助手” Lin Haoran’s Programming Adventure: From “Word Wizard” to “English All-in-One Assistant” 在那个代码编织而成的奇妙世界里&#xff0c;我们有幸遇见了一位名叫林浩然的程序员小哥。他可不是那种埋…