- 博客(39)
- 收藏
- 关注
原创 韦东山: 作为一个初学者,怎样学习嵌入式Linux?
被问过太多次,特写这篇文章来回答一下。在学习嵌入式Linux之前,肯定要有C语言基础。汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会)。C语言要学到什么程度呢?越熟当然越好,不熟的话也要具备基本技能。比如写一个数组排序、输入数字求和什么的。学C语言唯一的方法是多写程序多练习,编译出错没关系,自己去解决;执行出错没关系,自己去分析。以前我是用VC来练习C语言的,经常去尝试着写一些C语言竞赛的题目。它们是纯C、纯数学、纯逻辑的题目,不涉及界面这些东西,很适合煅炼你的编程能力。...
2022-02-18 10:19:03
1852
2
原创 [uC/OS-III] 22. 互斥量
1. 互斥量的基本概念互斥量又称互斥信号量(本质也是一种信号量,不具备传递数据功能),是一种特殊的二值信号量,它和信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性,用于实现对临界资源的独占式处理。任意时刻互斥量的状态只有两种,开锁或闭锁。2.互斥量的优先级继承机制在很多场合中,某些资源只有一个,当低优先级任务正在占用该资源的时候,即便高优先级任务也只能乖乖的等待低优先级任务使用完该资源后释放资源。这里高优先级任务无法运行而低优先级任务可以运行的现象称为“优先级翻转”。优先级翻
2022-02-16 16:03:08
482
原创 [uC/OS-III] 21. 信号量
1. 信号量基本概念信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问, 常用于协助一组相互竞争的任务来访问临界资源。二值信号量:在 uCOS 中我们用信号量用于同步,任务与任务的同步,中断与任务的同步,可以大大提高效率。计数信号量:在实际的使用中,我们常将计数信号量用于事件计数与资源管理。2. 信号量应用场景因为信号量资源被获取了,信号量值就是 0,信号量资源被释放,信号量值就是 1,把这种只有 0 和 1 两种情况的信号量称之为二值信号量。二值信
2022-02-16 15:36:17
720
原创 [uC/OS-III] 20. 消息队列
1. 消息队列的基本概念队列又称消息队列,是一种常用于任务间通信的数据结构, 队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息,当队列中的消息是空时,读取消息的任务将被阻塞,用户还可以指定阻塞的任务时间timeout,在这段时间中,如果队列为空,该任务将保持阻塞状态以等待队列数据有效。通过消息队列服务,任务或中断服务程序可以将消息放入消息队列中。同样,一个或多个任务可以从消息队列中获得消息。当有多个消息发送到消息队列时,通常
2022-02-15 16:36:32
565
原创 [uC/OS-III] 19. 任务管理
1. 任务的基本概念uCOS 的任务可认为是一系列独立任务的集合。每个任务在自己的环境中运行。在任何时刻,只有一个任务得到运行, uCOS 调度器决定运行哪个任务。调度器会不断的启动、停止每一个任务,宏观看上去所有的任务都在同时在执行。作为任务,不需要对调度器的活动有所了解,在任务切入切出时保存上下文环境(寄存器值、堆栈内容)是调度器主要的职责。2. 任务调度器的基本概念uCOS 中提供的任务调度器是基于优先级的全抢占式调度:在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢
2022-02-15 16:09:29
336
原创 [uC/OS-III] 18. uC/OS-III 的启动流程
在目前的 RTOS 中,主要有两种比较流行的启动方式:1. 万事俱备,只欠东风在 main 函数中将硬件初始化,RTOS 系统初始化,所有任务的创建这些都弄好,这个我称之为万事都已经准备好。最后只欠一道东风,即启动 RTOS 的调度器,开始多任务的调度。2. 小心翼翼,十分谨慎在 main 函数中将硬件和 RTOS 系统先初始化好,然后创建一个启动任务后就启动调度器,然后在启动任务里面创建各种应用任务,当所有任务都创建成功后,启动任务把自己删除。3. 系统的启动在系统上电的时候第一个执.
2022-02-14 16:44:52
496
原创 [uC/OS-III] 17.创建任务
上章基于STM32板子创建好了uC/OS-III工程模板,这章开始真正进入如何使用uCOS的征程。1.硬件初始化要将 LED 相关的函数初始化好,为了方便以后统一管理板级外设的初始化,我们在 bsp.c 文件中创建一个 BSP_Init()函数,专门用于存放板级外设初始化函数。其中运行顺序如下——首先运行BSP_Init ()函数, 接下来才慢慢启动操作系统uC/OS-III, 最后运行创建好的任务。2.创建单任务定义任务栈: 在 uCOS 系统中,每一个任务都是独立的,他们的运行环境都单独
2022-02-14 16:06:14
487
原创 [uC/OS-III] 16.移植uC/OS-III到STM32
1.获取STM32的裸机工程模板使用之前裸机编写的固件库例程就好了,点亮LED灯的例程。获取就好了。2.下载uCOSIII 源码uCOS-III 是一个操作系统,其实也可以理解成一个软件库,它可以移植到多种硬件平台,如 M3、 M4、 M7 内核的 STM32,或者 ARM9 等等其他芯片。核心代码肯定是一致的,但是针对不同的处理器肯定要不同的实现部分。所以针对每个CPU出了不一样的OS。这个在官网下载适用于M3核的源码。3.uCOS-III 源码文件介绍4.移植到STM32工程所谓
2022-02-14 15:01:13
4076
原创 [uC/OS-III] 1.2.3.4 章认识RTOS
1.第一章 前言课程包括了从0到1写一个uC/OS-III系统,就是单片机的最简kernel,内核OS;还包括这个自己写出来的kernel系统的一些应用举例,这两部分内容。当然写kernel的难度较大,也是理解更深刻。这个时候发现原来OS竟然也是人一行行代码写出来的,是统一调度各个任务管理,各种管理的一个函数程序。规范接口的一个平台程序。我们在他的平台上面进行规范的开发工作。一般操作系统课程也是两部分,讲解计算机OS工作原理,代码分析。但是代码量特别大不好分析,清除工作原理已经是很不错了。2.第
2022-02-11 11:00:36
738
原创 野火13:GPIO输入——按键检测
#include "stm32f10x.h"#include "bsp_led.h" #include "bsp_key.h"int main(void){ /* LED端口初始化,跟上一节的LED一模一样,直接拿过来用 */ LED_GPIO_Config(); LED1_ON; /* 按键端口初始化 ,在上一节的基础上改了一点点东西而已*/ Key_GPIO_Config(); /* 轮询按键状态,若按键按下则反转LED...
2022-01-13 10:30:20
3728
2
原创 野火12:GPIO输出——用固件库点亮LED
这里写了bsp_led.c bsp_led.h 两个文件,是为了包装硬件,让在不同的硬件结构下可以方便的调整使用。分别用来存放了 “初始化控制LED的IO” 和“定义LED连接的GPIO端口, 用户只需要修改下面的代码即可改变控制的LED引脚”。1.bsp_led.c#include "bsp_led.h" /**初始化控制LED的IO*/void LED_GPIO_Config(void){ /*定义一个GPIO_InitTypeDef类型的结构体...
2022-01-08 16:41:03
1152
2
原创 野火10.11:初识STM32标准库,新建库函数版工程
10. 标准库,就是ST公司已经写好了像上节一样的一些封装,最原始的地址开始,寄存器的命名,这样后续直接使用,方便调用。库包含了内核和外设的。都包进库里面了。查阅使用。11.新建工程,库函数版这个就是在新建工程的时候,需要把ST公司的一些库包含进来了,或者添加进来,支撑自己后续的调用。直接都加进来即可。...
2022-01-08 16:27:26
535
原创 野火9:自己写库——构建库函数雏形
9.3.1 外设寄存器结构体定义#define _IO volatiletypedef unsigned int uint32_t;typedef unsigned short uint16_t;//GPIO寄存器结构体定义typedef struct{ _IO uint32_t CRL; _IO uint32_t CRH; _IO uint32_t IDR; _IO uint32_t ODR; _IO uint32_t BSRR; _IO u...
2022-01-06 11:07:00
678
原创 野火8:使用寄存器点亮LED灯
stm32f10x.h文件用于添加寄存器地址及结构体定义,这里就不放进来了,对片上外设基地址,GPIOB的外设基地址,做了定义。然后GPIOB寄存器地址,强制转换成指针,方便下面使用。/* *工程模板(寄存器版本) */#include "stm32f10x.h"/** * 主函数 */int main(void){ // 开启GPIOB 端口时钟, //RCC_APB2ENR寄存器显示第三位,为GPIOB的时钟使能,1位IO端口B时钟开启,所以该...
2022-01-05 14:32:40
902
3
原创 野火1-7 基础部分
1. 前言2. Keil 5的安装,已装OK;3.用DAP仿真器下载程序注意keil5里面魔法棒的设置(Target/ output/ debug/ utilities),无需其他辅助软件,直接keil5里面LOAD按钮就可以下载进去了。4.串口下载程序跟51单片机一样,使用串口专门的软件ISP下载,需要USB转串口的驱动,串口线连接电脑和单片机。在ISP里面选择需要烧录的.hex文件,点击下载,即可。5.初识STM32ST意法半导体,意法半导体开发的32位微控制器。6.什么
2022-01-04 17:23:34
596
原创 C---指针应用:正确做除打印结果,否则不打印
//如果除法成功,打印出来(返回1);除法不成功返回0情况下不打印结果;#include<stdio.h>int divide(int a, int b, int *result);int main(void){ int a,b,c; scanf("%d %d",&a,&b); if(divide(a,b,&c)) //if为真的情况下,打印;if=0为假不打印结果。 { printf("%d/%d=%d\n...
2021-12-29 16:35:42
588
原创 C---指针的应用:找出数组最大最小值
//输出数组里面的最大值和最小值#include<stdio.h>void minmax(int a[], int len, int *max, int *min); //声明函数int main(void){ int a[]={5,2,3,4,5,6,7,8,9,12,13,14,25,1,28,35,36,55,12,102,12} ; int min,max; minmax(a,sizeof(a)/sizeof(a[0]), &min,&am...
2021-12-29 16:05:22
2608
原创 C---数组与函数
题目:输入0~9之间的数字若干个,以输入-1结尾,统计每个数字出现的个数。#include <stdio.h> //宏定义 stdio.hint main(){ const int number = 10; //数组的大小,count里面有10个数字,都是int型的。 int x; int count[number]; int i; for (i=0;i<number;i++...
2021-12-28 11:23:07
342
原创 8. IIC中写一个数,再读出来,让数码管的第一个灯亮
//利用C语言编写程序: 单片机给EEPROM里面写一个数字,再读出来,点亮一个二极管。#include<reg52.h>#define uchar unsigned char#define uint unsigned intbit write = 0; //写24C02的标志sbit sda = P2 ^ 0;sbit scl = P2 ^ 1;sbit dula = P2 ^ 6;sbit wela = P2 ^ 7;//uchar z,sec...
2021-12-17 21:19:24
1016
原创 8.IIC中写一个数,再读出来,让数码管的第一个灯亮
//利用C语言编写程序: 单片机给EEPROM里面写一个数字,再读出来,点亮一个二极管。#include<reg52.h>#define uchar unsigned char#define uint unsigned intbit write = 0; //写24C02的标志sbit sda = P2 ^ 0;sbit scl = P2 ^ 1;sbit dula = P2 ^ 6;sbit wela = P2 ^ 7;//uchar sec, ...
2021-12-17 17:32:56
358
原创 8 单片机与E2PROM AT24C02之间 I2C 通信实例
//利用C语言编写程序: 利用定时器产生一个0~99秒变化的秒表,并显示在数码管上,每过一秒,将这个变化的数写入AT24C02内部。//关闭再打开电源时,单片机先从AT24C02 EEPROM中将原理写入的数读出来,接着此数继续变化并显示在数码管上。#include<reg52.h>#define uchar unsigned char#define uint unsigned intbit write = 0; //写24C02的标...
2021-12-14 15:15:54
1000
原创 7.1-7.2 液晶1602操作实例
//用C语言编程,实现在1602液晶的第一行显示“I LOVE MCU”,第二行显示“WWW.TXMCU.COM”.#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[] = "I LOVE MCU!";uchar code table1[] = "WWW.TXMCU.COM";sbit lcden = P3 ^ 4; //液晶使能端sb...
2021-12-13 16:27:08
1885
原创 6.1-6.5 串行口通信原理与串行口方式1编码实现
//在上位机用串口调试助手发送一个字符X,单片机收到字符后返回给上位机“I get X”,串口波特率设为9600bps。#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar flag, a, i;uchar code table[] = "I get";void init(){ TMOD = 0x20; //设定T1定时器工作方式2 TH1 = 0xfd; ...
2021-12-04 15:28:08
594
原创 5.4~5.6 D/A转换、DAC0832实现方式
数字量是用二进制代码按数位组合起来表示的,对于有权码,每位代码都有一定的权。为了将数字量转换成模拟量,必须将每1位的代码按其权的大小转化成模拟量,然后将这些模拟量相加,即可得到与数字量成正比的模拟量,从而实现数模转换,这是构成D/A转换器的基本思路。//用单片机控制DAC0832芯片输出电流,让二极管D12由灭均匀变到最亮,再由最亮均匀熄灭。//在最亮和最暗时刻使用蜂鸣器分别报警一声,完成整个周期时间控制在5s左右,循环变化。#include<reg52.h>#define uchar
2021-12-04 10:54:45
965
1
原创 5.1 ~5.3 模拟量/数字量,A/D转换,ADC0804实现方法
//用单片机控制ADC0804进行模数转换,当拧动实验板上A/D旁的电位器Re2时,在数码管的前3位//以十进制方式动态显示出A/D转换后的数字量(8位A/D转换后数值在0~255变化)。#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit dula = P2 ^ 6;sbit wela = P2 ^ 7;sbit adwr = P3
2021-12-04 09:52:22
2436
1
原创 4.2 矩阵键盘检测
//实验板上电数码管不显示,顺序按下矩阵键盘,数码管依次显示0~F 16个数字,6个数码管同时静态显示。#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5.
2021-11-30 19:33:41
781
原创 4.1 独立键盘检测
题目:用数码管的前两位显示一个十进制的数,00~59变化,开始显示00,每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再按下S5键,数值停止自动加1,保持显示原数。#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;s
2021-11-30 14:35:02
1525
1
原创 3.4 3.5 单片机的定时器中断
//用定时器0的方式1实现第一个发光管以200ms间隔闪烁;//用定时器1的方式1实现数码管前两位59s循环计时。#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //申明U1锁存器锁存端sbit wela=P2^7; //申明U2锁存器锁存端sbit led1=P1^0;uchar code table[]={0x3f,0x06...
2021-11-29 17:31:06
933
1
原创 3.3 数码管动态显示
题目:第一个数码管显示1,亮0.5s,关闭,第二个显示2,亮0.5s,关闭,第六个显示6,亮关;再第一个亮,循环。//第一个亮1,0.5s,第二个亮2,0.5s,直到第六个#include <reg52.h>#include<intrins.h>sbit dula=P2^6; //申明U1锁存器的锁存端sbit wela=P2^7; //申明U2锁存器的锁存端void delayms(uint x);#define uint unsigned i...
2021-11-26 15:14:54
443
1
原创 2021/11/25 感恩节夜晚第一次点亮二极管
今天买的单片机板子到了,好开心,兴冲冲的打开它,好好看了又看。然后洗澡完后对照着视频,给电脑安装了STC ISP软件,用来串口烧录的工具软件,这里面就有一个它的驱动问题了,即要安装STC ISP的驱动,然后电脑才能识别它并进行通讯。1. 软件安装包里面有驱动,按照SOP可以进行禁用签名启动,但是设备管理控制器页面没有显示该设备,且没有黄色叹号——后发现我插的USB是只供电的那个,不是可下载的那个USB,没看清!2. 淘宝人指导后USB 端口识别到,且有黄色叹号,按照SOP加装指定的驱动,但是加不
2021-11-26 13:26:21
190
原创 3.1-3.2 数码管及静态显示
多个数码管一起时候, 位选 是可单独控制的, 段选 是连接在一起的,通过位选信号控制哪个数码管亮;在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为他们的段选是连接在一起的,这种显示方法叫做静态显示。题目1:让第一个数码管显示数字8.#include <reg52.h>sbit dula=P2^6; //申明U1锁存器的锁存端sbit wela=P2^7; //申明U2锁存器的锁存端void main(){wela=1; ...
2021-11-25 17:10:03
937
2
原创 2.8 利用C51库函数实现流水灯
逻辑运算,库自带函数都可以实现位移的效果:1.a=a << 1, 表示新的a是旧的a的所有位都左移一位,新a的最后一位用0填补; 2. a=_crol_(a,1) 表示循环左移,新a是旧a的各个位的数字都左移一位得到的,其中新a的最后一位是旧a的第一位循环过去。题目:以500ms为间隔,在板子上实现流水灯,即第一个灯亮500ms,接着第二个灯亮500ms,接着第三个一直循环。#include<reg52.h>#include<intrins.h> ...
2021-11-25 11:01:53
1709
原创 2.7 带参数函数的写法及调用
在上节不带参数的函数的基础上,扩展一下,就成了带参数的函数了。题目:让第一个二极管亮200ms,灭800ms,这样闪烁#include<reg52.h>#define uint unsigned intvoid delayxms(uint xms) //uint是xms的数据类型; xms是这个函数的形参,形式上的参数,下面的200是他的实际参数,实参。{uint i,j;for(i=xms;i>0;i--) // 定义函数...
2021-11-24 22:26:15
250
原创 2.6 不带参数函数 的写法及调用
上节中这个函数被用到了2次,可以定义它为一个不带参数的函数,而第二次使用就直接调用这个函数就好了。for(i=1000;i>0;i--) for (j=110;j>0;j--);定义为这样的:void delay1s() /*它不返回任何值;然后这个函数名字是自己随便取得,好记就行了*/{for(i=1000;i>0;i--) for (j=110;j>0;j--);}题目:让二极管第一个灯按照500ms间隔来进行闪灭#include<...
2021-11-24 22:04:07
1063
原创 2.5 Keil仿真,延时语句时间精确计算
#define 新名称 原来的内容软件的模拟调试模式下,可以分布执行,观察执行时间sec的累计数值变化在所在行前双击鼠标,会出现红色方框,全速执行的话会停留在这行,显示执行到这行的累计时间;再次执行全速执行,会到下一个红方框前,可以看时间。...
2021-11-24 20:52:46
636
原创 2.4 for语句及简单延时语句
for (表达式1;表达式2;表达式3){语句}执行1,执行2,若2为真则执行语句且继续执行3; 若2为假则跳出for循环。写一个嵌套循环语句:unsigned char i,j;for (i=100;i>0;i--) for (j=200;j>0;j--);
2021-11-24 20:39:01
412
原创 2.3 while语句
前面的点亮二极管工作,点亮之后没有动作了,所以单片机会不断重复的点亮二极管,没有明确下一步做啥的话单片机可能会出错。我们的意图是点亮二极管,停一会,或者保持住这个状态,实现方式。while(表达式){内部语句,内部语句可为空}先判断表达式,再执行内部语句。当表达式为真,执行内部,否则跳出while执行到下一个语句。然后这是一个完整的程序,点亮第一个等之后,开始了while,一直为真,就一直执行它,不跳到下一个语句。即灯被点亮后,一直等待,无下一个执行语句。#include
2021-11-24 20:26:41
189
原创 2.2 点亮第一个发光二极管
在Keil 6.12软件里面新建工程,再新建一个文件,把这个文件挂到工程名下面。然后开始在文件里面写程序去点亮第一个发光二极管。#include <reg52.h> /*52系列单片机头文件,安装Keil软件时候已经copy了reg52.h文件到电脑中,把 reg52.h文件在这里调用一下,就不用把这个文件里面写过的定义再写一遍了 */sbit led1=P1^0; /* 声明单片机P1口的第一位为led1,后面为了只操作led1方便;P1口的第...
2021-11-24 16:36:02
2057
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人