RT-Thread 串口操作实践

添加串口设备

我手头的开发版是 ART-Pi 电路上引出了两排排针,其中有一个 USART1 串口,电路图如下:

CubeMX 配置

接下来我们打开示例代码 sdk-bsp-stm32h750-realthread-artpi\projects\art_pi_blink_led 中的 board 目录中的 CubeMX 进行配置。

这里需要注意的是有些功能的管脚是共用的,如果我们在 Categories 中点击选择,会默认选择管脚,但是实际上和我们所使用的不一致,这种情况要先在 Pinout view 上面点击选择对应管脚设置再打开。

阅读更多

刚到的 ART-Pi 开发板点灯总结

ART-Pi 是 RT-Thread 团队经过半年的精心准备,专门为嵌入式软件工程师、开源创客设计的一款极具扩展功能的 DIY 开源硬件。

官网地址:http://art-pi.gitee.io/website/

MDK5 烧写示例程序

买回来没自信看文档,所以导致板子的 boot_loader 被擦除了,于是乎烧写进去的程序没有反应。

阅读更多

RT-Thread 中的多线程

前面有一篇我们写了一个按键控制 LED 显示的例子,现在我们尝试将该功能单独放入一个线程进行管理。

RT-Thread 线程管理和调度

RT-Thread 线程管理的主要功能是对线程进行管理和调度,系统中总共存在两类线程,分别是系统线程用户线程,系统线程是由 RT-Thread 内核创建的线程,用户线程是由应用程序创建的线程,这两类线程都会从内核对象容器中分配线程对象,当线程被删除时,也会被从对象容器中删除,如图 4-2 所示,每个线程都有重要的属性,如线程控制块、线程栈、入口函数等。

RT-Thread 的线程调度器是抢占式的,主要的工作就是从就绪线程列表中查找最高优先级线程,保证最高优先级的线程能够被运行,最高优先级的任务一旦就绪,总能得到 CPU 的使用权。

阅读更多

RT-Thread 的 CPU 固件移植理解

RT-Thread 的 CPU 抽象层

在嵌入式领域有多重不同的 CPU 架构,我们知道 RT-Thread 是支持不同架构的嵌入式操作系统,我们先来大概看一下 RT-Thread 的架构。

RT-Thread 的架构示意图 RT-Thread 的架构示意图

可以看到 RT-Thread 提供了一个 libcpu 抽象层来适配不同的 CPU 架构, libcpu 向上对内核提供统一的接口,包括全局中断的开关,线程栈的初始化,上下文切换等。

RT-Thread 的 libcpu 抽象层向下提供了一套统一的 CPU 架构移植接口,这部分接口包含了全局中断 开关函数、线程上下文切换函数、时钟节拍的配置和中断函数、Cache 等等内容。

阅读更多

潘多拉STM32L4的简单部件控制

通过按键切换点亮的 LED 灯

电路原理

通过电路原理图我们可以看到 R-G-B 三个 LED 灯共用 3.3v 阳极,通过电阻分压到单片机管脚,原理很简单,我们给管脚输出低电平则相应的 LED 点亮。

1
2
3
4
#define LED_PIN_RED  GET_PIN(E, 7)  //定义红灯管脚

rt_pin_mode(LED_PIN_RED, PIN_MODE_OUTPUT); //定义管脚模式为输入
rt_pin_write(LED_PIN_RED, PIN_LOW);  //低电平点亮

按键的线路接法自带上拉电阻,所以我们设置输入模式为 PIN_MODE_INPUT 即可,不需要考虑上下拉输入模式。

按键连接示意图 按键连接示意图

阅读更多

RT-Thread 学习启动篇

RT-Thread 系统

RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS)。

RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务通过线程实现的,RT-Thread 中的线程调度器也就是以上提到的任务调度器。

与 Linux 系统比较

相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此以外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。虽然 32 位 MCU 是它的主要运行平台,实际上很多带有 MMU、基于 ARM9、ARM11 甚至 Cortex-A 系列级别 CPU 的应用处理器在特定应用场合也适合使用 RT-Thread。

RT-Thread 的系统架构

RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件,如下图所示。

RT-Thread的系统架构图 RT-Thread的系统架构图

阅读更多

给博客增加自动变化的工作年限

在我博客的关于页面有一段自我介绍,其中有一个工作年限,每过一年就需要增加一次,这样比较麻烦,所以我准备使用 js 来实现自动计算。

本科 应用物理学 专业,目前主要使用 Java / Kotlin 两门语言,从事 Android ,略懂一些 C / C++ / Python / JavaScript / Nodejs 等其他语言,目前没有什么特别大的成就,在一边工作的同时维持着本站的正常运行。

首先使用 <span> 标签替换要更改的内容部分,然后定义一个标签 id.

1
从事Android <span id="development_years"></span>,略懂一些......

然后使用 <script> 标签来写日期计算相关方法:

阅读更多

Android TelephonyManager 信号强度

手机网络信号强度的单位是 dBm (毫瓦分贝),一般用负数表示。

正常手机信号变化范围是从 -110dBm (差)到 -50dBm (好)之间,如果比 -50dBm 还小的话,说明你就站在基站的附近。

2G,3G,4G 获得信号强度的方式都是重写 PhoneStateListener 的 onSignalStrengthsChanged() 方法,当信号强度发生改变的时候就会触发这个事件,我们可以在这个事件里获取信号强度。

关于 dBm,还有一个定公式:

1
2
dBm = -113 + 2 * asu  #2G
dBm = -140 + asu      #4G

阅读更多

Android Studio 配置阿里云镜像地址

背景

平时安卓项目编译较慢,其中一个原因就是要下载依赖资源包比较慢。为了解决这个问题,可以配置阿里云镜像,加速下载。

配置方法

全局配置

这种配置对所有项目默认都会生效,会自动替换默认的链接为阿里云镜像链接。

用户目录/.gradle 目录下新增文件 init.gradle.

在用户目录下新增文件示意 在用户目录下新增文件示意

init.gradle 文件添加内容,下面代码直接复制粘贴进去:

阅读更多

Google Fonts 国内使用方案

概述

当前 WordPress 等许多开源网站大部分的主题都在使用 Google 的在线字体方案 —— Google Fonts,Google 服务在大陆的崩溃情况使得大量的独立网站字体无法加载,大大影响到了国内相关网站的网页响应速度,现将解决方案总结如下:

Google Fonts 国内使用方案概览图 Google Fonts 国内使用方案概览图

解决方案一:本地加载字体包(推荐)

  1. 在 CSS 中找到被导入的 Google Fonts
1
2
#此处以该字体为例#
@import url(https://fonts.googleapis.com/css?family=Raleway:400,300,800|Lora:400italic|Playfair+Display:700);

阅读更多

Dart 语法游历记【下】「译」

Dart 是一种面向对象语言,包含类和基于 mixin 的继承两部分。每个对象是一个类的实例,并且 Object 是所有类的父类。基于 mixin 的继承指的是每个类(除了 Object )都只有一个父类,类体还可以在多个类继承中被重用。

要创建一个对象,你可以使用 new 关键词并在其后跟上一个构造函数。构造函数可以写成类名,或者类名.标识符形式。例如:

1
2
3
4
5
6
7
var jsonData = JSON.decode('{"x":1, "y":2}');

//用 Point() 创建一个点。
var p1 = new Point(2, 2);

// 用 Point().fromJson() 创建一个点。
var p2 = new Point.fromJson(jsonData);

对象的成员分为函数和数据两类(各自的方法和实例变量)。当你调用一个方法时,你是通过一个对象来调用它的:该方法可访问该对象的方法和数据。用 . 指向对象的方法和数据成员。

阅读更多

Dart 语法游历记【上】「译」

说明

从今天起我计划看一下 Flutter ,既然要学习 Flutter 势必要先看看 Dart 的语法了,于是就找到了官网的一篇文章 《A tour of the Dart language》,接下来几篇也算是对这篇文章的翻译吧,希望我能从中学到东西,也希望对大家有所帮助。

接下来会向大家展示 Dart 语言的语法特征,从变量和操作符到类和库,这里已经假设你掌握了一门计算机语言,熟悉计算机编程。关于更多 Dart 知识建议你参考语法示例 《Language samples》

启动 DartPad

DartPad 会在顶栏显示当前实例的状态,方便进行查看。打开 DartPad

Dart 中的默认入口函数是 main 函数,可以省略 void 返回声明和 String[] args 参数,例如可以这样写:

阅读更多