你好,一、RT-Thread的定义。
RT-Thread,全称是 Real Time-Thread, 是一款主要由中国开源社区主导开发的开源实时操作系统(许可证GPLv2),包含了实时、嵌入式系统相关的各个组件:TCP/IP协议栈、图形用户界面等。
相较于Linux,RT-Thread 具有体积小,成本低,功耗低、启动快速的优势。除此以外,实时性高、占用资源小等特点,使得它也非常适用于各种资源受限(如成本、功耗限制等)的场合。
在物联网设备的应用中,RT-Thread 能使用在线软件包管理工具,配合系统配置工具,实现直观、快速的模块化裁剪、无缝导入丰富的软件功能包,以及类似 Android 的图形界面和触摸滑动、智能语音交互等复杂功能。
RT-Thread 系统完全开源,可以免费在商业产品中使用,并且不需要公开私有代码。
二、RT-Thread的架构
相对于一些传统的RTOS 如 FreeRTOS、uC/OS 等,RT-Thread 架构上最大的区别在于:它是一个物联网操作系统(IoT OS)。
即RT-Thread 除了包含一个实时内核外,还包括如文件系统、图形库等较为完整的中间件组件,是具备低功耗、安全、通信协议支持和云端连接能力的软件平台,如下图所示:
在这里插入图片描述
具体包括以下部分:
内核层:
① RT-Thread 内核:系统核心部分,包括了内核系统中对象的实现,例如多线程及其调度、消息队列、内存管理等;
② libcpu/BSP(芯片移植相关文件 / 板级支持包):与硬件密切相关,由外设驱动和 CPU 移植构成;
组件与服务层:
组件是基于内核之上的上层软件,例如虚拟文件系统、FinSH 命令行界面、网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合;
RT-Thread 软件包:
运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。开发者可依据自身需求,选择、组合不同软件包,打造自己想要的系统。
目前支持的软件包有且不仅有:
① 物联网相关:Paho MQTT、WebClient、mongoose、WebTerminal 等;
② 脚本语言相关:JerryScript、MicroPython ;
③ 多媒体相关:Openmv、mupdf;
④ 系统相关:RTGUI、Persimmon UI、lwext4、partition、SQLite 等。
三、RT-Thread的开发工具。
Env 是 RT-Thread 的开发辅助工具,提供编译构建环境、图形化系统配置、软件包管理等功能。主要特性如下:
使用 scons 作为构建工具(根据一定的规则或指令,将源代码编译成可执行的二进制程序),提供编译环境,生成工程;
内置简单易用的配置剪裁工具——menuconfig,可对内核、组件和软件包进行自由裁剪,以搭积木的方式构建系统;
借助由 Kconfig 语法 编写的Kconfig 文件,生成系统配置文件 rtconfig.h。rtconfig.h 文件,负责在执行 menuconfig 命令时,指导生成 RT-Thread 系统的配置、剪裁界面;
提供多种软件包,可在线下载,各包耦合关联少,具有良好的可维护性。
python模块smtplib安装方法如下,根据你的需要选择执行:
[root@localhost ~]# pip search smtplib。
PyEmail (0.0.1) - Python library to send emails using SMTPLIB library。
micropython-smtplib (0.0.0) - Dummy smtplib module for MicroPython。
personal (0.1.1) - Easy, secure self notification via email and sms, using smtplib and twilio。
aiosmtplib (0.1.4) - asyncio version of smtplib。
secure-smtplib (0.1.1) - Secure SMTP subclasses for Python 2。
mailclient (0.2.0) - Simplified use of smtplib for Python. Easy email sending.。
smtplibaio (1.0.3) - An async version of smtplib。
easyemail (0.4.0) - Simple lib abstracting email sending with smtplib.。
python模块:smtplib模块使用本地的sendmail协议进行邮件发送:
格式(1):smtpObj=smtplib.SMTP([host [,port [,local_hostname]]])。
host:SMTP服务器主机的IP地址或者是域名。
port:服务的端口号(默认是25)。
local_hostname:服务器的地址(默认是localhost)。
格式(2):SMTP.sendmail(from_addr),to_addrs,msg[,mail_options,rcpt_options]。
from_addr:邮件发送的地址。
to_addr:邮件接收地址
msg:发送信息
# -*- code: utf-8 -*-。
# 在 micropython 中运行, 注意在运行目录下有 hzk12/16。
# '啊' 是汉字区第1个汉字,对应数据为 ?不对?
# 0x00, 0x00, 0x0E, 0xFC, 0xEA, 0x08, 0xAA, 0x08,。
# 0xAA, 0xE8, 0xAA, 0xA8, 0xAC, 0xA8, 0xAA, 0xA8,。
# 0xAA, 0xA8, 0xAA, 0xA8, 0xEA, 0xE8, 0xAA, 0xA8,。
# 0x0C, 0x08, 0x08, 0x08, 0x08, 0x28, 0x08, 0x10。
# hzk16 试验: '一','我'正确, '啊' 不对?。
# hzk12 字库的位长度是16*12。
# seek位置 '一': 111168, '五': 103152, '我':102196。
'''
int(x [,base ]) 将x转换为一个整数 。
long(x [,base ]) 将x转换为一个长整数 。
float(x ) 将x转换到一个浮点数 。
complex(real [,imag ]) 创建一个复数 。
str(x ) 将对象 x 转换为字符串 。
repr(x ) 将对象 x 转换为表达式字符串 。
eval(str ) 用来计算在字符串中的有效Python表达式,并返回一个对象 。
tuple(s ) 将序列 s 转换为一个元组 。
list(s ) 将序列 s 转换为一个列表 。
chr(x ) 将一个整数转换为一个字符 。
unichr(x ) 将一个整数转换为Unicode字符 。
ord(x ) 将一个字符转换为它的整数值 。
hex(x ) 将一个整数转换为一个十六进制字符串 。
oct(x ) 将一个整数转换为一个八进制字符串。
bytearray(x) 列表转为数组。
'''
from machine import Pin, I2C。
import framebuf。
import ssd1306
i2c = I2C(sda=Pin(5), scl=Pin(4))。
o = ssd1306.SSD1306_I2C(128,64,i2c)。
def drawhz( hzs, xp, yp ):。
for x in range( len(hzs)//2 ):。
c = ((hzs[x*2] - 0xA1)* 94 + (hzs[x*2+1] - 0xA1)) * 24 #gb2312 转成 区位号。
f = open( 'uc_hzk12', 'rb' )。
f.seek( c )
hz = bytearray( f.read(24) )。
f.close()
# 创建 hzk12:16x12 or hzk16:16x16 大小帧缓存区储存图片帧,水平扫描。
fb1 = framebuf.FrameBuffer(hz, 16, 12, framebuf.MONO_HLSB)。
o.blit( fb1, xp + x*12, yp ) # 将fb1帧缓存送至oled显示,起始位(38,16)。
xp += 1
#在 repl 中, 粘贴的中文件变码了, 装载文件形式才正常。
def drawhz2(hzs, xp, yp):。
for x in range(len(hzs)):。
f = open('uni2gb', 'rb')。
f.seek( (ord(hzs[x])-0x4e00)*2 )。
gb23 = bytearray(f.read(2))。
f.close()
c = ((gb23[0] - 0xA1) * 94 + (gb23[1] - 0xA1)) * \。
24 # gb2312 转成 区位号。
f = open('uc_hzk12', 'rb')。
f.seek(c)
hz = bytearray(f.read(24))。
f.close()
# 创建 hzk12:16x12 or hzk16:16x16 大小帧缓存区储存图片帧,水平扫描。
fb1 = framebuf.FrameBuffer(hz, 16, 12, framebuf.MONO_HLSB)。
o.blit(fb1, xp + x*12, yp) # 将fb1帧缓存送至oled显示,起始位(38,16)。
xp += 1
o.fill(0)
# uPY没法实现unicode 转 gb2312, 要借助cpython 转化成 gb2312。
#现在可用 文件查表法 uni2gb (unicode-0x4e00)转gb2312码。
hzs = ( 206,210, 185,253, 193,249, 210,187, 189,218 ) #每两字节表示一个汉字。
drawhz2( '\u98de\u96ea\u8fde\u5929', 0, 0 )。
drawhz2( '\u98de\u96ea\u8fde\u5929\u5c04\u767d\u9e7f', 0, 13 ) #飞雪连天。
drawhz( hzs, 0, 26 )。
drawhz( hzs, 16, 39)。
drawhz( hzs, 16, 52 )。
o.show()
pico-8安装需要IDE(Thonny IDE)并且需要进入软件官网下载软件,最好下载最新版的,否则可能不支持树莓派 PICO。
安装Thonny,安装完成后打开软件,打开工具->设置-> 解释器,选择MicroPython(Raspberry Pi Pico)解释器,并在串口处选择树莓派PICO的串口号(如果板子已经连接在电脑上,软件一般会自动检测串口号)。
重启软件,可以看到软件左下方显示了树莓派PICO中的文件。
pico-8中存在的问题是:
外部中断是:外部中断是单片机实时地处理外部事件的一种内部机制。
当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。
外部中断的作用:节省CPU资源。
在3.04 按键实验中,检测按键是否被按下采用的是在主程序中写死循环的办法,假如这个按键被按下的频率十分低(一天只有几次被按下),采用死循环的方法将会浪费大量的CPU资源,而采用外部中断的方式检测按键是否被按下将大大节省CPU资源。