RT-Thread

RT-Thread Studio移植EasyFlash和ulog_easyflash注意事项

浪尽此生 提交于 2020-08-17 17:49:45
Github官方源码及文档看这里: https://github.com/armink/EasyFlash https://github.com/armink-rtt-pkgs/ulog_easyflash 移植过程参考官方文档即可,这里简单说一下我自己在移植过程中踩过的坑以及一些注意事项: 尽量在RT-Thread里面使用一种日志,ulog和easylogger尽可能选择其中一个即可,否则会造成一些不必要的麻烦。我原先在开启ulog的基础上配置easylogger的时候,INFO初始化时遇到了问题,后来发现ulog的配置和EasyLogger的有一部分串了,修改起来也比较麻烦。ulog_easyflash其实就是ulog的一种后端,已经能够完美对接easyflash了,因此如果使用ulog就能完成,尽可能还是选择官方推荐的ulog吧。 EasyFlash目前支持的硬件平台仅3种(截止我写博客时间2020/8/15):stm32f10x和stm32f40x的片内Flash,还有基于SPI(QSPI)的片外FLASH,因此如果不是f1或f4的芯片还是用片外FLASH比较好。其中片外Flash的移植方式又分为两种:基于fal库和基于SFUD库的,因此在如果是使用片外Flash的话记得先配置以上这两种库。官方手册给出的配置方式如下,本次博主使用的是F7系列芯片

看懂芯片原来这么简单(十一):Connectivity芯片的成团经历——蓝牙、Wi-Fi、GNSS是如何合作的?...

瘦欲@ 提交于 2020-08-16 16:41:48
如果说SoC芯片是各种芯能力的集合 那Connectivity芯片就是专注联接的小团体 我们日常使用的 Wi-Fi 、蓝牙 、NFC 、 红外 等 都来自天团—— Connectivity芯片 Huawei Share和一碰传是如何实现的? 是谁在帮我们定位? 和麒麟君一起从芯探索联接能力吧↓↓↓ 来源:华为麒麟微信公众号(ID:Huawei_Kirin) 1. 2020年第8期《单片机与嵌入式系统应用》电子刊新鲜出炉! 2. 除了考虑技术,还要重点考虑物联网的社会属性! 3. 传感器+MCU成大趋势!30家国产MCU厂商综合实力对比 4. Arm前总裁:Arm卖给任何半导体公司都是坏消息! 5. 新唐科技与达成RT-Thread战略合作! 6. 国务院抛出集成电路政策大礼包,最高免税十年 免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证 明材料确认版权并支付稿酬或者删除内容。 来源: oschina 链接: https://my.oschina.net/u/4363296/blog/4497715

搭建智慧农业物联网云平台——基于阿里云物联网平台构建

只谈情不闲聊 提交于 2020-08-14 13:30:00
前言 8.1.1 物联网平台搭建 8.2.1 LinkDevelop平台使用 8.2.2 iotkit-embedded 前言 传统的物联网项目,需要嵌入式硬件、云平台。对于我们做嵌入式的来说,从零开始搭建一个物联网云平台几乎是不现实的。 这里涉及到许多前后端的知识。 通过阿里云物联网平台,我们可以在不懂前后端开发的基础上,半个小时候左右就可以搭建一个智慧农业的物联网云平台框架。 效果如下: 大数据面板: 设备管理: 设备地图分布: 支持视频监控: 多个组件图标功能: 8.1.1 物联网平台搭建 物联网平台搭建的话,我放在了bilibili这里: https://www.bilibili.com/video/bv1DK4y1s7Pc 8.2.1 LinkDevelop平台使用 1.注册 打开LinkDevelop官网: https://iot.aliyun.com/products/linkdevelop 。单击“立即使用”按钮,如图8.3所示。 图8.3 LinkDevelop官网 2.新建项目 单击左侧的“项目管理”按钮,随后再单击“新建项目”按钮,进入新建项目界面,如图8.4所示。 图8.4 项目管理界面 随后在弹出来的新建项目界面上,单击“新建空白项目”按钮,如图8.5所示。 图8.5 新建项目界面 弹出新建空白项目界面后,在“项目名称”中输入test,在“描述

lwip协议以太网驱动层的软件数据结构详细解析

扶醉桌前 提交于 2020-08-14 10:52:11
1、概述 本文详细介绍了LWIP协议在rt-thread操作系统上的驱动层结构,rt thread操作系统的硬件驱动层采用标准的设备驱动结构,网络接口对应的网络设备netdev。网络设备下面对应的是以太网驱动程序,同时网络设备向应用层提供网络的各种功能接口,实现了如linux操作系统的ifconfig, ping命令等功能。整个lwip协议到底层硬件的结构如下,具体的参考代码可以查看rt-thread 3.1.3的正点原子阿波罗bsp工程。 lwip协议的软件层次结构 2、网络接口驱动层的数据结构 网络驱动部分的接口由硬件驱动接口层drv_eth.c,drv_eth.h,netif接口层ethernetif.c, ethernetif.h,netfi.c,netif.h,网络设备层netdev.c, netdev.h这些函数组成。每一层的程序都有一个数据结构来表示程序的使用的数据状态。请看下图,先对各个层对应的数据结构有一个初步的印象,混个脸熟先。 2.1 硬件驱动接口层 硬件驱动接口层drv_eth.c, drv_eth.h两个文件组成,drv_eth.c是操作系统的网络设备驱动程序,程序内部实现了设备驱动底层的open,close, read,write,ioctl这几个函数的功能。 对于网络设备只实现了ioctl函数的功能,由于读取网络的mac地址,其他几个函数全部为空

你是不是也好奇飞机黑盒子里用了什么芯片?

浪尽此生 提交于 2020-08-13 16:15:43
作者:微博用户@y1nzicng,来源:朝晖航空 今天献宝,给大家秀一下F A2100座舱语音记录器的拆解。 先说一下背景,大概就是在某个垃圾场捡到的,本着研究的性质拆解来看看内部构造,原本并没想着去记录过程,就只是草草的拍了几张照片,不少资料都是去查的,本人对电路不熟,如果下文有错的地方,还请各位业内人士不吝赐教。 开始之前先回答两个问题,为什么黑匣子是橙色的 ? 为什么会叫做黑匣子? 颜色问题大家都猜得到,橙色有更高的辨识度,方便寻找和定位,毕竟储存的是非常重要的飞行数据。 至于为什么被叫做黑匣子,有一种比较广泛认可的说法是因为工作原理比较简单,只需要输入数据就行,至于内部发生了什么无从得知,有点类似于“盲盒”。 然后还有人会问我,我拆的这个是不是失事飞机掉下来的→_→ 如果真是失事飞机掉下来的。那么此时此刻这个黑匣子应该长这样: 或者是这样↓ 所以说放心吧,这是一个正常退役的黑匣子。 接下来,咱们再来做一点额外的功课,否则一会儿看拆解会有点云里雾里。 飞机上的黑匣子主要有两个—FDR和CVR。 上为FDR,下为CVR Flight Data Recorder(FDR),中文一般叫飞行数据记录器,主要是记录飞机飞行过程中各项指标参数数据的设备。一般说黑匣子大部分都是指的FDR,是空难调查中最重要的直接证据。 Cockpit Voice Recorder(CVR)

RT-Thread学习记录3 简单的线程实例—跑马灯实验

家住魔仙堡 提交于 2020-08-12 23:29:05
1 线程状态转换图 线程初始状态是还没有运行, 当调用rt_thread_startup()后线程就是就绪态,系统根据就绪态的优先级来确定那个线程运行, 运行态执行完后就返回到就绪态。 当运行态需要共享资源时,调用图中1的函数后变为挂起态(也称阻塞态)。 运行态调用rt_thread_exit()后变为关闭态。 系统运行就在图中的状态之间转换,主要在就绪状态,运行状态,挂起状态三者之间转换。 当线程不需要运行时,可以调用rt_thread_exit()处于关闭态。 2 每一个操作系统中都存在一个“系统心跳”时钟,是操作系统中最小的时钟单位。这个时钟负.责系统和时间相关的- -些操作。作为操作系统运行的时间尺度,心跳时钟是由硬件定时器的定时中断产生。 系统的心跳时钟我们也常称之为系统滴答或时钟节拍,系统滴答的频率需要我们根据cpu的处理能力来决定。 时钟节拍使得内核可以将线程延时若干个整数时钟节拍,以及线程等待事件发生时,提供等待超时的依据。 频率越快,内核函数介入系统运行的几率就越大,内核占用的处理器时间就越长,系统的负荷就变大; 频率越小,时间处理精度又不够; 我们在stm32平台上一般设置系统滴答频率为100HZ,即每个滴答的时间是10ms 在代码board.c里有STM32硬件定时器配置函数如下图,配置时钟为1 秒时间跳100次 = 100 Hz,一个时钟节拍为10毫秒。

RT-Thread学习记录15 内存池的使用

情到浓时终转凉″ 提交于 2020-08-12 06:14:24
以下为看视频笔记.......... 1. 内存池的介绍 动态内存堆可以分配任意大小的内存块,非常灵活和方便。但其存在明显的缺点:一是分配效率不高,在每次分配时,都要进行空闲内存块查找;二是容易产生内存碎片。 为了提高内存分配的效率,并且避免内存碎片,RT-Thread 提供了另外一种内存管理方法:内存池(Memory Pool ) 内存池是一种内存分配方式,用于分配大量大小相同的小内存块。使用内存池可以极大地加快内存分配与释放的速度,且能尽量避免内存碎片化。 RT-Thread的内存池支持线程挂起功能,当内存池中无空闲内存块时,申请线程会被挂起,直到内存池中有新的可用内存块,再将挂起的线程唤醒。基于这个特点内存池非常适合需要通过内存资源进行同步的场景。 2. 内存池工作机制 内存池在创建时先从系统中获取一大块内存 ( 静态或动态),然后分成相同大小的多个小内存块,这些小内存块通过链表连接起来(此链表也称为空闲链表)。线程每次申请分配内存块的时候,系统从空闲链表中取出链头上第一个内存块, 提供给申请者。 3. 内存池控制块 在RT_Thread中,内存池控制块是操作系统用于管理内存池的一个数据结构。 struct rt_mempool { struct rt_object parent: void *start_address;//保存申请的内存的地址 rt_size_t size

【STM32F4】【银杏科技ARM+FPGA】iCore3移植RT-Thread--内核之互斥量

邮差的信 提交于 2020-08-11 09:01:53
一、 互斥量的引入   互斥量类似于ATM取款机:当有客户进入的时候,将取款机门锁住,其他客户在外面等候。当里面的客户出来时,将门打开,下一个客户才可以进入。   由此,互斥量与信号量的工作机制就比较相似,其实,互斥量是特殊的二进制信号量。信号量用于线程的同步,好比交通灯,线程只有在获得许可的时候才可以运行,强调的是步骤;互斥量用于线程的互斥,就像一把锁,只有获取钥匙的线程才可以运行,强调的是许可和权限。   互斥量只有两种状态,开锁或闭锁。当有线程持有它时,互斥量处于闭锁状态,由这个线程获得它的所有权。相反,当这个线程释放它时,将对互斥量进行开锁,失去它的持有权。当一个线程持有互斥量时,其他线程将不能够对它进行开锁或持有它。 二、 互斥量和信号量的相同之处 1,创建时,线程阻塞排序均可以选择优先级或先进先出方式。 2,线程阻塞时间均可以选择直接返回、挂起一段时间、永久等待。 三、 互斥量和信号量的区别 1.互斥量用于线程的互斥,信号量用于线程的同步。 2.互斥量值只能为0或1,信号量值为非负整数。 一个互斥量只能允许一个资源访问。信号量可以实现多个同类资源的多线程互斥和同步。 3.信号量可以由任何线程释放,但互斥锁只有获得了其控制权的线程才可以释放,即:只有“锁上”它的那个线程才有“钥匙”打开它。 4.信号量可能导致线程优先级反转,而互斥锁可通过优先级继承的方法解决优先级反转问题

实用算法解读之RT-Thread链表堆管理器

a 夏天 提交于 2020-08-10 07:33:12
RT-Thread 在社区广受欢迎,阅读了其内核代码,实现了堆的管理,代码设计很清晰,可读性很好。故一方面了解RT-Thread内核实现,一方面可以弄清楚其堆的内部实现。将学习体会记录分享,希望对于堆的理解及实现有一个更深入的认知。 注,文中代码分析基于rt-thread-v4.0.2 版本。 什么是堆? C语言堆是由malloc(),calloc(),realloc()等函数动态获取内存的一种机制。使用完成后,由程序员调用free()等函数进行释放。使用时,需要包含stdlib.h头文件。 C++预言的堆管理则是使用new操作符向堆管理器申请动态内存分配,使用delete操作符将使用完毕内存的释放给堆管理器。 注:本文只描述C的堆管理器实现相关内容。 以C语言为例,将上面的描述,翻译成一个图: 要动态管理一片内存,且需要动态分配释放,这样一个需求。很显然C语言需要将动态内存区抽象描述起来并实现动态管理。事实上,C语言中堆管理器其本质是利用数据结构将堆区抽象描述,所需要描述的方面: 可用于分配的内存 正在使用的内存块 释放掉的内存块 再利用相应算法对于这类数据结构对象进行动态管理而实现的堆管理器。 **经常看到各种算法书很多只讲算法原理,而不讲应用实例,往往体会不深。私以为可以做些改善。学而不能致用,何必费力去学。所以不是晦涩难懂的算法无用,而是没有去真正结合应用。可以再进一步想

RT-Thread学习记录1 动态内存的使用

只谈情不闲聊 提交于 2020-08-10 06:55:04
先使用Keil软件仿真运行程序学习, RT-Thread Simulator 例程 , 例程结合B站视频一起学习 。程序包括多个例程。 以下为看视频的笔记。。。。 栈(stack):有编译器自动分配释放 堆(heap):一般有程序员分配释放 int a = 0; //全局初始化区 char *p1; //全局未初始化区 mian() { int b; //栈 char s[] = "abc123"; //栈 char *p2; //栈 char *p3 = "123654"; //123654在常量区,p3在栈上 static int c = 0; //全局(静态)初始化区 p1 = (char *)malloc(10); //堆 p2 = (char *)malloc(15); //堆 } void rt_system_heap_init(void *begin_addr, void *end_addr)//系统分配堆的大小函数API { ....... } 点击工程文件可以打开map文件查看系统RAM,ROM使用大小。 char *p; int num = 10; p = (char *)rt_malloc(num); /* 如果分配成功 */ if (ptr != RT_NULL) { rt_memset(p,0,num); } //.......处理内容.... rt