CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。支持裸机、ucos  rh-thread,freertos.适配 Cortex-M0/M3/M4/M7 MCU;支持中英文输出。

ulog:与开源easy log很像,可将程序运行过程中的一些状态信息分标签、级别输出到不同的后端(控制台、文件、网络),逐步取代RTT早期的elog/rt_dbg。资源占用小(ROM<1K, RAM<0.2K),分同步模式(为避免影响线程只能输出到控制台)、异步模式(支持在中断、hardfault下使用(CmBacktrace已经做了适配),需要bug和专门的日志处理线程),用用好主要是注意日志的标签、级别、过滤。

#define LOG_E(...)                           ulog_e(LOG_TAG, __VA_ARGS__)
#define LOG_W(...) ulog_w(LOG_TAG, __VA_ARGS__)
#define LOG_I(...) ulog_i(LOG_TAG, __VA_ARGS__)
#define LOG_D(...) ulog_d(LOG_TAG, __VA_ARGS__)
#define LOG_RAW(...) ulog_raw(__VA_ARGS__)
#define LOG_HEX(name, width, buf, size) ulog_hex(name, width, buf, size)

ulog 主要有两种日志输出宏 AP

utest简介

utest的初衷是方便RT-Thread开发者使用统一的框架接口编写测试程序,实现单元测试,覆盖测试以及集成测试的目的,utest测试框架依赖ULOG模块日志进行日志输出,utest的断言宏uassert 仅记录通过和失败的数量,不会产生断言并终止程序运行。其功能不等同于 RT_ASSERT。

AT组件:

GSM/GPRS等模组一般都通过AT命令通讯,RTT的AT组件对客户端(也支持多客户端)和服务器都可适配,除了发送命令,解析返回数据(第几行,关键字),还能处理URC数据(自己设计URC数据表:收到的前缀,前缀匹配后的响应函数)

DFS:设备的虚拟文件系统,以文件夹为容器,以文件为单位的抽象数据类型。可实现了数据的存储、分级组织、访问和获取等操作。

  • FatFS 是专为小型嵌入式设备开发的一个兼容微软 FAT(文件名都大写,最多8个字符,后缀最多3个) 格式的文件系统,采用 ANSI C 编写,具有良好的硬件无关性以及可移植性,是 RT-Thread 中最常用的文件系统类型。

  • 传统型的 RomFS 文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以 XIP(execute In Place,片内运行) 方式运行,在系统运行时, 节省 RAM 空间。

  • Jffs2 文件系统是一种日志闪存文件系统。主要用于 NOR 型闪存,基于 MTD 驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃 / 掉电安全保护,提供写平衡支持等。

  • DevFS 即设备文件系统,在 RT-Thread 操作系统中开启该功能后,可以将系统中的设备在 /dev 文件夹下虚拟成文件,使得设备可以按照文件的操作方式使用 read、write 等接口进行操作。

  • NFS 网络文件系统(Network File System)是一项在不同机器、不同操作系统之间通过网络共享文件的技术。在操作系统的开发调试阶段,可以利用该技术在主机上建立基于 NFS 的根文件系统,挂载到嵌入式设备上,可以很方便地修改根文件系统的内容。

  • UFFS 是 Ultra-low-cost Flash File System(超低功耗的闪存文件系统)的简称。它是国人开发的、专为嵌入式设备等小内存环境中使用 Nand Flash 的开源文件系统。与嵌入式中常使用的 Yaffs 文件系统相比具有资源占用少、启动速度快、免费等优势。

只有块设备才可以挂在文件系统,所以需要在指定的外设(SPI/SD)上创块设备。然后格式化文件系统dfs_mkfs()(特定的文件系统),然后挂载文件系统(int dfs_mount(),即)将一个存储设备挂接到一个已存在的路径上(我们对该路径上的文件进行操作))。用完后卸载文件系统dfs_unmount。

文件的常用操作:以/为根路径,以fd文件操作符为基本单位,进行文件的open()打开/创建、读、写、添加、查找、重命名、关闭,同步文件到存储设备int fsync(int fildes)等操作。

目录的操作:创建mkdir、打开opendir、读取opendir、关闭closedir。

文件系统操作常用的 FinSH 命令如下表所示:

FinSH 命令 描述
ls 显示文件和目录的信息
cd 进入指定目录
cp 复制文件
rm 删除文件或目录
mv 将文件移动位置或改名
echo 将指定内容写入指定文件,当文件存在时,就写入该文件,当文件不存在时就新创建一个文件并写入
cat 展示文件的内容
pwd 打印出当前目录地址
mkdir 创建文件夹
mkfs 格式化文件系统

注意:

  RT-Thread/FatFs 默认使用 437 编码(美国英语)。如果需要存储中文文件名,可以使用 936 编码(GBK编码)。936 编码需要一个大约 180KB 的字库

NetDev:即网络接口设备,又称网卡,主要作用是解决设备多网卡连接时网络连接问题(比如同时有网口和4G,设定网口为缺省,4G备用),用于统一管理各个网卡信息与网络连接状态,并且提供统一的网卡调试命令接口,RT-Thread 系统中目前支持三种协议栈类型: lwIP 协议栈、AT Socket 协议栈、WIZnet TCP/IP硬件协议栈.网卡的统一操作接口

  • up/down: 底层网卡初始化完成之后置为 up 状态,用于判断网卡开启还是禁用。
  • link_up/link_down: 用于判断网卡设备是否具有有效的链路连接,连接后可以与其他网络设备进行通信。该状态一般由网卡底层驱动设置。
  • internet_up/internet_down: 用于判断设备是否连接到因特网,接入后可以与外网设备进行通信。
  • dhcp_enable/dhcp_disable: 用于判断当前网卡设备是否开启 DHCP 功能支持。

统一的调试接口:ping、ifconfig(设置 IP地址、网关和子网掩码时应确保dhcp_disable)、netstat、dns 等命令

SAL:RT-Thread 系统提供了一套 SAL(套接字抽象层)组件,该组件完成对不同网络协议栈或网络实现接口的抽象并对上层提供一组标准的 BSD Socket API.SAL在netDev之上。TLS(Transport Layer Security,传输层安全协议从SSL发展而来) 是建立在传输层 TCP 协议之上的协议,目前常用的 TLS 的实现方式:MbedTLS、OpenSSL、s2n

/* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */
host = gethostbyname(SAL_TLS_HOST);
* 创建一个socket,类型是SOCKET_STREAM,TCP 协议, TLS 类型 */
sock = socket(AF_INET, SOCK_STREAM, ROTOCOL_TLS);
/* 初始化预连接的服务端地址 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SAL_TLS_PORT);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), , sizeof(server_addr.sin_zero));
/* 初始化预连接的服务端地址 */
connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
/* 发送数据到 socket 连接 */
ret = send(sock, send_data, strlen(send_data), );
/* 接收并打印响应的数据,使用加密数据传输 */
bytes_received = recv(sock, recv_data, SAL_TLS_BUFSZ - , );
//绑定套接字(bind)
int bind(int s, const struct sockaddr *name, socklen_t namelen);
//监听套接字(listen)
int listen(int s, int backlog);
//接收连接(accept)
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
//建立连接(connect)
int connect(int s, const struct sockaddr *name, socklen_t namelen);
//TCP 数据发送(send)
int send(int s, const void *dataptr, size_t size, int flags);
//UDP 数据发送(sendto)
int sendto(int s, const void *dataptr, size_t size, int flags, const struct sockaddr *to, socklen_t tolen);
//UDP 数据接收(recvfrom)
int recvfrom(int s, void *mem, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
//关闭套接字(closesocket)
int closesocket(int s);
//获取远端地址信息(getpeername)
int getpeername(int s, struct sockaddr *name, socklen_t *namelen);
//获取本地地址信息(getsockname)
int getsockname(int s, struct sockaddr *name, socklen_t *namelen);
//配置套接字参数(ioctlsocket)
int ioctlsocket(int s, long cmd, void *arg);
//获取套接字选项(getsockopt)
int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);
//设置套接字选项(setsockopt)
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
//关闭套接字(closesocket)
int closesocket(int s);

PM低功耗管理:

  低功耗的通常策略:主控时钟频率的调整、工作电压的改变、总线频率的调整甚至关闭、外围设备工作时钟的关闭,外设电源的关闭,单片机的低功耗模式与唤醒(时钟频率、工作模式),需要注意的是进入低功耗模式时有2个问题:1是os_tick的补偿,以内进入低功耗模式后系统时钟停止,此时要切换低功耗定时器(RTC)计算出唤醒时间或者其它中断的唤醒源,并在唤醒后对os_tick进行补偿;2对于低功耗敏感的功能模式要考虑进出低功耗模式时的状态保持、恢复、和状态改变相关的(如周期延时的时基改变,串口的波特率改变)这些通过注册PM设备,设置挂起和恢复时的回调函数。

RT_THREAD之组件学习的更多相关文章

  1. C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...

  2. bootstrap组件学习

    转自http://v3.bootcss.com/components/ bootstrap组件学习 矢量图标的用法<span class="glyphicon glyphicon-se ...

  3. C# BackgroundWorker组件学习

    C# BackgroundWorker组件学习  C# BackgroundWorker组件学习 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用Ba ...

  4. [Python] wxPython 状态栏组件、消息对话框组件 学习总结(原创)

    1.状态栏组件 1.基本介绍 上图: 红框框内的就是状态栏. 他可以分成若干个区块,比如上者分为了两个区块,并且比例是固定的,创建时可以指定 每个区块都能够显示 信息,一般通过 绑定事件 实时更新 各 ...

  5. Vue组件学习

    根据Vue官方文档学习的笔记 在学习vue时,组件学习比较吃力,尤其是组件间的通信,所以总结一下,官方文档的组件部分. 注册组件 全局组件 语法如下,组件模板需要使用一个根标签包裹起来.data必须是 ...

  6. vue组件学习(二)

    父子组件之间的数据传递, 父传给子: 直接在组件上传,如:<count :number="2"> (冒号和不要冒号的区别,有冒号会自动转为相应的类型)在名为count的 ...

  7. vue组件学习(一)

    1, vue中的 is 的用法,有时候我们需要把一个组件绑定到指定的标签下,比如把tr组件放到table下,直接这样写是不行的, <!DOCTYPE html> <html lang ...

  8. Jetpack架构组件学习(1)——LifeCycle的使用

    原文地址:Jetpack架构组件学习(1)--LifeCycle的使用 | Stars-One的杂货小窝 要看本系列其他文章,可访问此链接Jetpack架构学习 | Stars-One的杂货小窝 最近 ...

  9. Jetpack架构组件学习(2)——ViewModel和Livedata使用

    要看本系列其他文章,可访问此链接Jetpack架构学习 | Stars-One的杂货小窝 原文地址:Jetpack架构组件学习(2)--ViewModel和Livedata使用 | Stars-One ...

随机推荐

  1. 后台异常 - sql语句查询出的结果与dao层返回的结果不一致

    问题描述 sql语句查询出的结果与dao层返回的结果不一致 问题原因 (1)select 中,查询的列名称重复,数据出现错乱 (2)使用不等号,不等号(!=,<>),查询出来的结果集不包含 ...

  2. ubuntu安装搜狗输入

    百度搜索搜狗输入ubuntu找到官网地址 下载deb包 sogoupinyin_2.3.1.0112_amd64.deb 上传 dkpkg  -i   sogoupinyin_2.3.1.0112_a ...

  3. centost redhat 卸载rpm以及yum install 的正确姿势

    先看yum  install 的卸载: 第一列为我们要的包名: 那么要移除必须使用 yum list |grep  collectd | awk '{print $1}' |xargs  yum  r ...

  4. LitElement(四)属性

    1.概述 LitElement管理您声明的属性及其对应的属性.默认情况下,LitElement将: 确保在任何声明的属性更改时进行元素更新. 捕获已声明属性的实例值.在浏览器注册自定义元素定义之前设置 ...

  5. Python爬取mc皮肤【爬虫项目】

    首先,找到一个皮肤网站,其中一个著名的皮肤网站就是 https://littleskin.cn .进入网站,我们就会见到一堆皮肤,这就是今天我们要爬的皮肤.给各位分享一下代码. PS:另外很多人在学习 ...

  6. Spring事务之传播机制

    Spring事务传播机制:Spring在TransactionDefinition接口中规定了种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套时事务如何进行传播.即协调已经有事务标识的方法之 ...

  7. rancher布控集群启动失败

    rancher布控集群启动失败 待办 报告缺少某个文件.多线程启动任务部署的时候某些线程跑在前边了, 导致问题出现 解决思路:等待,等待响应的job重启就ok了,都是一些job在跑,失败了会重新开始的 ...

  8. 关于BaiduPSC-Go的一些bug的更正

    首先说下操作步骤 下载是在GutHub,这个不赘述,网上很多资料 下载之后配置环境变量,在path的后面加上一个分号,然后加上你下载的目录,目录名最好为英文 然后通过命令行CMD工具,输入BaiduP ...

  9. 959F - Mahmoud and Ehab and yet another xor task xor+dp(递推形)+离线

    959F - Mahmoud and Ehab and yet another xor task xor+dp+离线 题意 给出 n个值和q个询问,询问l,x,表示前l个数字子序列的异或和为x的子序列 ...

  10. docker删除镜像时报错解决办法

    报错信息 [root@kvm ~]# docker rmi 4950a54ede5a Error response from daemon: conflict: unable to delete 49 ...