产品人卫朋
左手产品,右手技术。《硬件产品经理》作者,“人人都是产品经理”专栏作家,“阿里云”开发者社区专家博主
展开
-
【IoT】加密与安全:动态密码 OTP 算法详解
动态密码,亦称一次性密码(One Time Password, 简称 OTP),是一种高效简单又比较安全的密码生成算法,在我们的生活以及工作中随处可见。1、动态密码背景介绍动态密码是指随着某一事件(密码被使用、一定的时间流逝等)的发生而重新生成的密码,因为动态密码本身最大优点是防重复执行攻击(replay attack),它能很好地避免类似静态密码可能被暴力破解等的缺陷,现实运用中,一般采...原创 2019-05-24 15:02:01 · 8417 阅读 · 1 评论 -
【IoT】STM32 编译指令 #pragma pack 的配对使用
#pragma pack 可以用来指定数据结构的成员变量的内存对齐数值。可选值为:1、2、4、8、16。使用 pack 指令要配对使用,以避免意外影响项目中其他源文件的结构成员的内存对齐。如果影响了其他源文件的结构成员内存对齐,那么在你按照默认对齐来计算那些结构成员占用内存大小或者使用指针移动计算结构成员偏移位置的时候,就可能会出现意料之外的异常。主要可能的异常是内存定位错误...原创 2019-04-01 09:42:07 · 1172 阅读 · 0 评论 -
【IoT】STM32 结构体对齐规则
1、对齐算法在相同的对齐方式下,结构体内部数据定义的顺序不同,结构体整体占据内存空间也不同。如下结构体定义:struct A {// a 的自身对齐值为 4,偏移地址为 0x00~0x03,a 的起始地址 0x00 满足 0x00%4=0int a;// b 的自身对齐值为 1,由于紧跟 a 之后的地址,即 0x04 满足 0x04%1=0,所以 b 存放在 0x04 地址空...原创 2019-04-01 09:18:40 · 2865 阅读 · 0 评论 -
【IoT】STM32 字节对齐 #pragma pack
1、对齐原则min(sizeof(word ), 4) = 2,因此是 2 字节对齐,而不是我们认为的 4 字节对齐。1)每个成员分别按自己的方式对齐,并能最小化长度;2)复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度;3)对齐后的结构体整体长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。对于数...原创 2019-03-29 19:14:51 · 1722 阅读 · 0 评论 -
【IoT】STM32 启动代码分析详解
1、堆栈存储器堆栈存储区是在片上存储器中的SRAM(或RAM)中由用户自行开辟的一片数据存储区域,并且堆栈区的大小可根据用户的需要任意指定(只要不超过SRAM或RAM的大小),而堆栈区的位置由编译器指定分配。Cortex-M3/M4处理器的堆栈指针SP是“满递减,空递增”,呈现向下逆生长的特点。堆栈区数据的存储特点是“先进后出,后进先出”。这种特点是由堆栈指针的移动方式决定的,...原创 2019-03-28 08:53:52 · 1626 阅读 · 0 评论 -
【IoT】STM32 启动代码汇编指令详解
● EQU伪指令EQU用来为一个数字常量或一个和内核寄存器相关的数值或一个和程序计数器相关的数值定义的一个符号名称,类似于C语言中的"#define"。语法格式:name EQU expr{ , type}注意:语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的;name:数值(expr)的符号名称;expr:一个与内核寄存器相关的地址,或一个绝对地址,或...原创 2019-03-27 09:24:25 · 2452 阅读 · 1 评论 -
【IoT】STM32 启动代码 __main 与用户主程序 main() 的区别
1、__main 作用__main函数是C/C++运行时库的一个函数,嵌入式系统在进入应用主程序之前必须有一个初始化的过程,使用__main标号引导系统时必须将应用程序的入口定义为main()。 在初始化的过程中,__main函数的作用主要有两点:1) 完成对映像文件的初始化操作a、映像文件链接器把多个目标文件链接成一个映像文件。b、加载地址和执行地址映像文件可以...转载 2019-03-27 09:06:37 · 5132 阅读 · 0 评论 -
嵌入式驱动源代码(4):STM32 分散加载文件 .sct 解析
1、STM32 启动文件与 .sct 文件分析1) 定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K;2) 定义HEAP段, {NOINIT,读写}:分配一段内存大小为1K;3) 定义RESET段,{DATA,只读}:DCD各种中断向量;4) 定义|.text|段,{CODE,只读}:Reset_Handler函数,函数中最后加载了__main;对剩余的中断...原创 2019-03-27 08:55:52 · 5230 阅读 · 2 评论 -
【IoT】STM32 FLASH 掉电数据丢失处理策略以及备份机制
1、原因由于FLASH的擦除和写入的特性,如果在擦除中掉电或者写入时掉电,有可能会出现失败的情况,下次再上电读取就会出错。擦除的时候掉电,不能保证擦除完全,但是已经擦除的部分,肯定是0xff了。写的时候掉电,已经写入的就是正确的,电平掉到最低极限工作电压附近时,写入的就无法保证了,地址无法保证,写入的值也无法保证。没有写到的,肯定还是 0xFF。 2、解决方式2.1、硬件方式...原创 2019-03-23 17:43:10 · 13878 阅读 · 2 评论 -
【IoT】STM32 查看 FLASH 和 RAM 使用情况(RO-data、RW-data、ZI-data)
1、KEIL MDK 编译后的信息Code=86496 RO-data=9064 RW-data=1452 ZI-data=161161)Code 是代码占用的空间;2)RO-data 是 Read Only 只读常量的大小,如const型;3)RW-data 是(Read Write)初始化了的可读写变量的大小;4)ZI-data 是(Zero Initialize) 没有...原创 2019-03-20 09:24:41 · 4862 阅读 · 0 评论 -
【IoT】STM32 编译结果 map 之 code、RO-data、RW-data、ZI-data 字段解析
1、Code即代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区。2、RO-dataRead Only data,即只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。例如:C语言中const关键字定义的变量就是典型的RO-data。3、RW-dataRead Write data,即可读写数据域,它指初始化为“非0值”的...原创 2019-03-19 19:06:22 · 1835 阅读 · 0 评论 -
嵌入式驱动源代码(5):STM32 文件系统 fatfs 移植笔记详解
1、内存和Flash介绍stm32 的 flash 地址起始于 0x0800 0000,结束地址是 0x0800 0000 加上芯片实际的 flash 大小,不同的芯片 flash 大小不同。RAM 起始地址是 0x2000 0000,结束地址是 0x2000 0000 加上芯片的 RAM 大小,不同的芯片RAM也不同。Flash 中的内容一般用来存储代码和一些定义为 const 的数...原创 2019-03-19 18:52:04 · 4437 阅读 · 1 评论 -
【Tool】ELF 和 AXF 文件分析详解
ELF(Executable and Linking Format)是一个定义了目标文件内部信息如何组成和组织的文件格式。内核会根据这些信息加载可执行文件,内核根据这些信息可以知道从文件哪里获取代码,从哪里获取初始化数据,在哪里应该加载共享库等信息。栈的地址是向下生长,堆的地址是向上生长:1、ELF 文件类型ELF 文件有下面三种类型:1)目标文件$ gcc -c ...原创 2019-03-13 09:37:09 · 5923 阅读 · 0 评论 -
【IoT】FreeRTOS 进阶:如何移植 freeRTOS 到 STM32 Cortex-M3
1、FreeRTOS 文件结构下载包根目录下包含两个子目录:FreeRTOS 和 FreeRTOS-Plus。其中,FreeRTOS-Plus 文件夹中包含一些 FreeRTOS+ 组件和演示例程,重点说一下 FreeRTOS 文件夹。FreeRTOS 文件夹下包含两个子目录:Demo 和 Source。其中,Demo 包含演示例程的工程文件,Source 包含实时操作系统...转载 2019-03-07 17:03:59 · 1373 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何使用FreeRTOS任务通知Notify
简析 notify 使用基础。基于 windows vs2012 运行效果:每个 RTOS 任务都有一个 32 位的通知值,任务创建时,这个值被初始化为 0。RTOS 任务通知相当于直接向任务发送一个事件,接收到通知的任务可以解除阻塞状态,前提是这个阻塞事件是因等待通知而引起的。发送通知的同时,也可以可选的改变接收任务的通知值。可以通过下列方法向接收任务更新通知:a、不覆盖接收...原创 2018-09-11 09:37:29 · 3316 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何使用FreeRTOS事件标志组
事件标志组使用浅析。1、头文件声明#include "FreeRTOS.h"#include "task.h"#include "event_groups.h"#include "timers.h" #include "supporting_functions.h"// 中断号 0 to 2 被用于 FreeRTOS Windows port#define mainINTE...原创 2018-09-10 22:09:31 · 3079 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何使用FreeRTOS互斥信号量(三)
简析互斥信号量的使用基础。1、头文件声明#include <stdio.h>#include <conio.h>#include "FreeRTOS.h"#include "task.h"#include "semphr.h"#include "supporting_functions.h"static void prvPrintTask( voi原创 2018-09-10 21:45:16 · 2808 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何在产品中同时使用FreeRTOS队列和中断
简析队列和中断的综合运用。1、头文件声明#include "FreeRTOS.h"#include "task.h"#include "queue.h"#include "supporting_functions.h"// 模拟中断号,中断号 0 和 2 已经被 FreeRTOS Windows port 占用#define mainINTERRUPT_NUMBER 3/...原创 2018-09-10 18:32:08 · 1997 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何使用FreeRTOS中断回调函数
介绍如何使用中断回调函数。1、头文件声明#include "FreeRTOS.h"#include "task.h"#include "timers.h"#include "supporting_functions.h"#define mainINTERRUPT_NUMBER 3static void vPeriodicTask( void *pvParameters );...原创 2018-09-10 16:06:33 · 5226 阅读 · 1 评论 -
【FreeRTOS】小白进阶之如何使用FreeRTOS多值信号量(二)
介绍多值信号量的使用。1、头文件声明#include "FreeRTOS.h"#include "task.h"#include "semphr.h"#include "supporting_functions.h"#define mainINTERRUPT_NUMBER 3static void vHandlerTask( void *pvParameters );st...原创 2018-09-10 15:50:13 · 1814 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何使用FreeRTOS二值信号量(一)
介绍信号量使用基础。1、头文件声明#include "FreeRTOS.h"#include "task.h"#include "semphr.h"#include "supporting_functions.h"#define mainINTERRUPT_NUMBER 3static void vHandlerTask( void *pvParameters );sta...原创 2018-09-10 15:38:02 · 3001 阅读 · 0 评论 -
【FreeRTOS】小白进阶之任务如何共用FreeRTOS软件定时器回调函数(二)
介绍两个定时器任务如何通过定时器 handle 共用一个回调函数。1、头文件声明和函数定义#include "FreeRTOS.h"#include "task.h"#include "timers.h"#include "supporting_functions.h"#define mainONE_SHOT_TIMER_PERIOD ( pdMS_TO_TICKS( 333...原创 2018-09-10 15:14:05 · 3919 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何使用FreeRTOS软件定时器(一)
介绍软件定时器使用基础:单次触发和自动重载定时器。1、头文件声明#include "FreeRTOS.h"#include "task.h"#include "timers.h"#include "supporting_functions.h"// 定义定时器相关时间#define mainONE_SHOT_TIMER_PERIOD ( pdMS_TO_TICKS( 333...原创 2018-09-10 11:51:12 · 14013 阅读 · 2 评论 -
【FreeRTOS】小白进阶之如何使用FreeRTOS Queue Set(三)
介绍 queue set 的基础使用。1、头文件声明和任务定义#include "FreeRTOS.h"#include "task.h"#include "queue.h"#include "supporting_functions.h"void vSenderTask1( void *pvParameters );void vSenderTask2( void *pvPa...原创 2018-09-10 11:35:29 · 3844 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何使用FreeRTOS消息队列发送和接收数据(二)
创建两个发送队列数据任务和一个接收队列数据任务。1、头文件声明和任务定义#include "FreeRTOS.h"#include "task.h"#include "queue.h"#include "supporting_functions.h"static void vSenderTask( void *pvParameters );static void vRecei...原创 2018-09-10 11:18:54 · 11965 阅读 · 1 评论 -
【FreeRTOS】小白进阶之如何创建和使用FreeRTOS消息队列(一)
文章主要讲解如何创建和使用队列。消息队列浅析:一个或者多个任务可以通过 RTOS 内核服务从队列中得到消息,通常先进入消息队列的消息先传给任务,即先进先出的原则(FIFO),FreeRTOS 的消息队列支持 FIFO 和 LIFO 两种数据存取方式。相比消息队列,使用全局数组主要有如下四个问题: a、使用消息队列可以让 RTOS 内核有效地管理任务,而全局数组是无法做到的,任务的...原创 2018-09-08 18:04:49 · 11446 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何动态创建和删除FreeRTOS任务
文章主要介绍如何动态创建和删除任务。1、头文件定义和启动任务#include "FreeRTOS.h"#include "task.h"#include "supporting_functions.h"void vTask1( void *pvParameters );void vTask2( void *pvParameters );// 定义任务2 handleTas...原创 2018-09-08 17:50:11 · 1175 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何动态设置FreeRTOS任务优先级
文章主要介绍如何动态改变任务优先级,同时简析如何使用任务 handle。1、头文件定义及任务创建#include "FreeRTOS.h"#include "task.h"#include "supporting_functions.h"void vTask1( void *pvParameters );void vTask2( void *pvParameters );...原创 2018-09-08 17:41:22 · 2918 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何使用FreeRTOS IDLE空闲任务
主要介绍空闲钩子函数的基本使用。windows VS2012 调试效果:1、头文件定义及启动任务#include "FreeRTOS.h"#include "task.h"#include "supporting_functions.h"void vTaskFunction( void *pvParameters );static uint32_t ulIdleCy...原创 2018-09-08 17:28:54 · 5422 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何创建FreeRTOS任务(三)
该文章主要介绍任务中使用的系统延时:通过 TICKS 实现。1、头文件#include "FreeRTOS.h"#include "task.h"#include "supporting_functions.h"void vTaskFunction( void *pvParameters );2、定义任务打印字符串const char *pcTextForTask1 =...原创 2018-09-08 17:17:27 · 1134 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何创建FreeRTOS任务(二)
创建两个任务但是共用一个任务函数,通过传递不同参数打印不同信息。1、头文件声明#include "FreeRTOS.h"#include "task.h"#include "supporting_functions.h"// 延时#define mainDELAY_LOOP_COUNT ( 0xffffff )2、声明任务函数// 任务函数声明void...原创 2018-09-06 17:59:03 · 1335 阅读 · 0 评论 -
【FreeRTOS】小白进阶之如何创建FreeRTOS任务(一)
创建了两个单独的任务并打印不同的信息。1、头文件声明#include "FreeRTOS.h"#include "task.h"#include "supporting_functions.h"// 延时#define mainDELAY_LOOP_COUNT ( 0xffffff )2、任务函数声明void vTask1( void *pvParame...原创 2018-09-06 17:28:53 · 5474 阅读 · 0 评论 -
【IoT】STM32 系统级开发之 ucosIII 或 freeRTOS 事件标志组详解
1、轻型操作系统同步的方案详解1)信号量假设有两个任务 Task1 和 Task2,第一个任务进行按键的扫描,第二个任务进行LED灯的点亮需求:扫描到按键按下后点亮 LED 灯,也就是说第二个任务永远在等待第一个任务按键的扫描实现:首先 Task1 一直检测按键是否按下,如果按键按下以后,使用一个全局变量 flag 并设置 flag=1而在 Task2 当中,不停检测 flag ...原创 2017-09-01 17:40:43 · 2905 阅读 · 1 评论