最近在指导一位读者朋友做毕业设计,该毕设是关于端云互通的,基于小熊派+LiteOS+华为云。 在指导他的过程中我也学到了不少东西,这里通过一个案例实验(智慧农业)给大家分享一些知识。 实验框图 相关模块简介 1、STM32L431RCT6 2、LiteOS LiteOS是华为开发的轻量级实时操作系统: LiteOS源码GitHub仓库链接: https://github.com/LiteOS/LiteOS 其源码一级目录结构如下: 其内核包括任务管理、内存管理、时间管理、通信机制、中断管理、队列管理、事件管理、定时器等操作系统基础组件,可以单独运行。 HuaweiLiteOS...

笔记整理自百问网+正点原子 前言 之前分享的笔记:【Linux笔记】总线设备驱动模型中在platform_device部分有简单说明描述设备有两种方法:一种是使用platform_device结构体来指定;另一种是使用设备树来描述。 本篇笔记我们就来简单地学习一下设备树的一些知识。 什么是设备树 设备树简单理解就是描述设备信息(资源)的一棵树。设备树(DeviceTree)用代码体现如下: 这些代码被保存在.dts/dtsi后缀文件中,也即设备树源文件 DTS(DeviceTreeSource)。 这些源文件同我们的C代码一样,并不能直接使用的,而是得经过一个编译过程生成机器可...

前言 我们可以从LED程序中榨取很多知识:基本的驱动框架、驱动的简单分层、驱动的分层+分离思想、总线设备驱动模型、设备树等。这大多都是结合韦老师的教程学的。 这篇笔记结合第6个demo(基于设备树)来学习、分析: 框图 下面是LED程序的几个层次结构图: 注意:层与层之间的箭头指向是相对的,从哪指向哪看你怎么理解。比如有两个函数:函数A和函数B,我们可以说函数A调用函数B,也可以说函数B被函数A调用。 本篇笔记基于第⑤个图来分析。 体验设备树 我们先来体验一下使用设备树描述引脚信息的方式来点灯。 以百问网开发板为例,修改内核目录Linux-4.9.88/arch/arm/bo...

本次要介绍的开源软件是c-periphery: https://github.com/vsergeev/c-periphery 一个用C语言编写的硬件外设访问库。 我们可以用它来读写Serial、SPI、I2C等,非常适合在嵌入式产品上使用。 我们可以基于它优秀的代码框架,不断地扩展出更多的功能模块,最终形成自己产品适用的Linux硬件抽象层。 源文件: $tree. ├──src │├──gpio.c │├──gpio.h │├──i2c.c │├──i2c.h │├──led.c │├──led.h │├──mmio.c │├──mmio.h │├──pwm.c │├──pwm....

1基本概念 1.1uboot是什么? 当我们厌倦了裸机程序,而想要采用操作系统的时候,uboot就是不得不引入的一段程序。所以,uboot就是一段引导程序,在加载系统内核之前,完成硬件初始化,内存映射,为后续内核的引导提供一个良好的环境。uboot是bootloader的一种,全称为universalbootloader。 1.2存储器 在了解Uboot之前,我们先来了解一下代码的载体,看看代码到底存储在什么地方! 1.norflash/nandflash、SRAM和SDRAM作为存储器有何异同? 1.norflash是非易失性存储器(也就是掉电保存) NORflash带有SRAM&nbs...

Linux中内存管理 内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。 虚拟地址的作用 如果用户进程直接操作物理地址会有以下的坏处: 1、用户进程可以直接操作内核对应的内存,破坏内核运行。 2、用户进程也会破坏其他进程的运行 CPU中寄存器中存储的是逻辑地址,需要进行映射才能转化为对应的物理地址,然后获取对应的内存。 通过引入逻辑地址,每个进程都拥有单独的逻辑地址范围。 当进程申请内存的时候,会为其分配逻辑地址和物理地址,并将逻辑地址和物理地址做一个映射。 所以,Linux内存管理涉及到了以下三个部分: 1、物理内存 物理内存的组织 ...

物联网设备OTA软件升级之:升级包下载过程之旅 第一:OTA概述 大家好,我是一个软件升级包。这几天呢,我将会进行一次神奇的网络之旅,从开发者的电脑中,一直跑到终端嵌入式设备中。 大家都把我的这个旅游过程叫做 OTA,也就是在线升级。 那么啥叫 OTA 呢?全称是:OvertheAirTechnology,其实就是通过网络来把一个软件包从服务器上下载下来,更新到设备上。 首先有一个问题:为什么叫软件升级包,而不叫固件升级包呢? 其实在本质上,固件也是属于软件,大家都是用代码写出来的嘛! 虽然这两个说法很近似,但是有一部分小伙伴还是在狭义上对它们进行了一些区分。...

  wod1c0aaFBnM   2023年11月13日   16   0   0 嵌入式服务器文件服务器

  ​编辑 BLE 蓝牙设备在生活中无处不在,但是我们也只是将其作为蓝牙模块进行使用,发送简单的AT命令实现数据收发。 那么,像对于一些复杂的使用场合:“车载蓝牙”、"智能手表"、“蓝牙音箱”等,我们不得不去了解底层的蓝牙实现原理。 1、蓝牙概念 2、蓝牙发展历程 3、蓝牙技术概述 3.1BasicRate(BR) 3.2LowEnergy(LE) 4、常见蓝牙架构 4.1SOC蓝牙单芯片方案 4.2SOC蓝牙+MCU方案 4.3蓝牙host+controller分开方案 4.4使用场景 5、参考文档 1、蓝...

  BLE 该部分主要分享一下常用的蓝牙调试工具,方便后续蓝牙抓包及分析。 1hciconfig 工具介绍:​​hciconfig​​,​​HCI​​设备配置工具 命令格式:​​hciconfig​​、​​hciconfig[-a]hciX[command...]​​ 详细命令如下: 只介绍几种常用命令 帮助信息:hciconfig-h 查看设备详细信息:hciconfig-ahci0或者hciconfig 打开/关闭/重置​hci​设备:hciconfighci0up/down/reset 认证打开/关闭:hciconfighci0auth/noauth,...

  wod1c0aaFBnM   2023年11月12日   11   0   0 嵌入式linux

文章目录 一、指针 二、指针的初始化 三、指针的运算 四、指针与数组 五、指针与字符串 六、函数指针 七、NULL指针 八、对复杂指针的解释 ​​C​​ 语言指针真正精髓的地方在于指针可以进行加减法,这一点极大的提升了程序的对指针使用的灵活性,同时也带来了不小的学习负担。正是因为 ​​C​​ 语言指针可运算,才奠定了如今 ​​C​​ 语言的地位。 一、指针 对于内存,我们可以简单地认为它就是大小相同、连续排布的格子,每一个格子的大小为一字节。为了更方便地找到某一个格子,我们通过对内存进行编号,通过编号来找到某一个具体的内存格子。 这样...

  wod1c0aaFBnM   2023年11月12日   15   0   0 linux指针

      数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。    常用的数据结构可根据数据访问的特点分为线性结构和非线性结构。线性结构包括常见的链表、栈、队列等,非线性结构包括树、图等。数据结构种类繁多,本文将通过图解的方式对常用的数据结构进行理论上的介绍和讲解,以方便大家掌握常用数据结构的基本知识。  1  ...

  wod1c0aaFBnM   2023年11月12日   17   0   0 链表数据结点

目录 ​​一、如何进行按键检测​​ ​​1.从裸机的角度分析​​ ​​2.从OS的角度分析​​ ​​二、最简单的按键检测程序​​ ​​三、为什么要了解FIFO​​ ​​四、什么是FIFO​​ ​​五、按键FIFO的优点​​ ​​六、按键FIFO的实现​​ ​​1.定义结构体​​ ​​2.将键值写入FIFO​​ ​​3.从FIFO读出键值​​ ​​4.按键检测程序​​ ​​5.按键扫描​​ ​​7.试验演示​​ 一、如何进行按键检测 检测按键有中断方式和GPIO查询方式两种。推荐大家用GPIO查询方式。 1.从裸机的角度分析 中断方式:中断方式可以快速地检测到按键按下,并执行相应的按键程...

  wod1c0aaFBnM   2023年11月12日   15   0   0 单片机按键事件

第一:linux系统中pthread_t定义 在linux中可以使用pthread_t来查看对应变量的定义 include<pthread.h> include<unistd.h> pthread_t; /Threadidentifiers.Thestructureoftheattributetypeisnot exposedonpurpose./ typedefunsignedlongintpthread_t; 总结:可以看到pthread_t就是unsignedlongint,在本系统中占用8个字节 ,即为uint64,打印线程ID需要用%lu格式。 第...

  wod1c0aaFBnM   2023年11月12日   16   0   0 Linux#includeci

    大家好,我是ST。     今天的话,主要和大家聊一聊,如何使用Cortex-A芯片自带的RAM,很多时候要运行Linux的话是完全不够用的,必须要外接一片RAM芯片,驱动开发板上的DDR3。 目录 第一:何为RAM和ROM 第二:DDR初始化与测试 第三:DDR框架图基本分析    第一:何为RAM和ROM     RAM:随机存储器,可以随时进行读写操作,速度很快,掉电以后数据会丢失。比如内存条,SRAM、DDR等都是RAM。 &nbsp...

    看到有小伙伴在讨论关于单片机内存的话题,今天就结合STM32给大家描述一下常见的划分区域。 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段。 总的分布如下所示: 内存高地址 栈区 堆区 .bss段 .data段 常量区 内存低地址 代码区 一、栈区(stack) 临时创建的局部变量存放在栈区。 函数调用时,其入口参数存放在栈区。 函数返回时,其返回值存放在栈区。 const定义...

   C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。    C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。    C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进入编程世界的必修课。    hello,world include<stdio.h> intmain() { /在双引号中间输入HelloWorld/ printf("HelloWorld"); return0; } ...

大家好,今天给介绍一款基于C语言的轻量级的Json库–cJson。可用于资源受限的嵌入式设备中。   cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。 cJSON是一个开源项目,github下载地址: https://github.com/DaveGamble/cJSON cJSON,目前来说,主要的文件有两个,一个 cJSON.c 一个 cJSON.h。使用的时候,将头文件include进去即可。 如果是在Linux操作系统中使用,编译到时候需要添加数学库 libm.so,如下所示: gcc.c...

1请列举您知道的电阻、电容、电感品牌(最好包括国内、国外品牌)。 电阻:美国:AVX、VISHAY威世日本:KOA兴亚、Kyocera京瓷、muRata村田、Panasonic松下、ROHM罗姆、susumu、TDK台湾:LIZ丽智、PHYCOM飞元、RALEC旺诠、ROYALOHM厚生、SUPEROHM美隆、TA-I大毅、TMTEC泰铭、TOKEN德键、TYOHM幸亚、UniOhm厚声、VITROHM、VIKING光颉、WALSIN华新科、YAGEO国巨新加坡:ASJ中国:FH风华、捷比信 电容:美国:AVX、KEMET基美、Skywell泽天、VISHAY威世英国:NOVER诺华德国:...

前言 话不多说,先来张脑图 linux虚拟内存知识回顾 虚拟内存空间长啥样 在Linux操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。比如最常见的32位和64位系统,如下所示: 通过这里可以看出: 32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间; 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的。 32位虚拟内存空间 通过这张图你可以看到,用户空间内存,从低到高分别是6种不同的内存段:...

嵌入式linux系统按照,分层,抽象的思想,按照这样的思想来设计我们的程序可以更容易写出耦合性低、独立性强、可重用性强的代码。 Linux内核中更是存在着更多的分离、分层思想的代码,platform平台设备驱动就是用了这样的思想。本篇笔记我们一起来学习一下platform驱动框架。 Linux引入platform的原因 对于Linux这样一个成熟、庞大、复杂的操作系统,代码的重用性非常重要,否则的话就会在Linux内核中存在大量无意义的重复代码。 为了能提高驱动代码的重用性,因此引入了platform。下面以一个例子来说明传统的设动转变至Linux总线、驱动和设备模式(来源:《正点原子Lin...

关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~