- 博客(76)
- 收藏
- 关注
原创 串口printf发送
链接: [link]https://download.youkuaiyun.com/download/weixin_44355245/89388735)
2024-06-02 17:58:55
249
原创 C++萃取的实现
#include <iostream>#include<string.h>using namespace std; template<typename T>struct my_is_pod{ static bool value; }; template<typename T>bool my_is_pod<T>::value = false;template<>struct my_is_pod<in
2024-04-24 08:45:15
94
原创 同一个网段下实现网络共享文件
网络共享文件的前提是两个设备在同一个网段下。该案例情况:通过PC机远程访问吊舱内SD卡的内容,无需将SD卡从吊舱取下再插入PC机上。共享文件设置控制面板->程序->->程序和功能->启动和关闭Windows功能,勾选SMB 1.0/CIFC文件共享支持,最后重启电脑。设置完成后,在任意一个文件夹的路径上输入:\+IP。...
2024-04-16 21:11:17
370
原创 FreeRTOS互斥锁
拿电脑中文档举例:当一个文档已经被打开,这时如果再双击打开这个文档,则会提示“操作无法完成,因为文件已在word软件中打开”。这是因为操作系统在第一次打开文件的时候,给文件设置了一把锁。而如果后面还有程序想要操作文件,则因为上锁的原因,打开失败。避免暂停系统运转,纯逻辑层面解决了临界资源争抢的问题。另外还能解决优先级反转的问题锁的机制:资源我正在用,已经上锁,我什么时候解锁,你什么时候用。上锁:防止随意访问解锁:有权访问。
2024-04-16 21:07:19
908
1
原创 用DMA传送LCD数据
前面我写了“FreeRTOS驱动ILI9488液晶”的代码,但是全程是使用CPU进行数据传送的,效率很低,所以本章进行DMA数据传输,解放CPU。3、因为只是实现刷屏一种颜色,所以不需要源地址自增,而目的地址只能是FSMC的映射地址0x64000002,所以也不自增;1、使用DMA传输数据的路径是从内存传输到FSMC中,都是在单片机内部进行,所以是Memory To Memory;完成上述配置后,将DMA相关配置代码添加进上期代码中,如下图所示。4、因为使用的是RGB565格式,所以字宽为半字。
2024-04-06 22:52:46
789
原创 51单片机控制IIC
IIC.c#include"IIC.h"#include<reg51.h>void delay10us(void) //误差 0us{ unsigned char a,b; for(b=1;b>0;b--) for(a=2;a>0;a--);}void I2C_Start(void){ SCL = 1; delay10us(); SDA = 1; delay10us(); SDA = 0; delay10us();
2024-04-03 09:15:07
244
原创 51单片机之DS18B20
DS18B20.h#ifndef __DS18B20_H__#define __DS18B20_H__#include<reg51.h>sbit DSPORT = P3^7;void delay600us(void);void delay15us(void);unsigned char Ds18b20Init(void);void Ds18b02WriteByte(unsigned char dat);unsigned char Ds18b02ReadByte(void)
2024-04-03 09:14:50
218
原创 51单片机控制LCD1602
LCD1602.c// 对LCD1602的底层和高层做封装#include"LCD1602.h"#include<reg51.h> #define LCD1602_DB P0sbit LCD1602_RS = P2^6;sbit LCD1602_RW = P2^5;sbit LCD1602_EN = P2^7; /*******************底层******************/void Read_Buzy(void){ unsigned char
2024-04-03 09:14:24
201
原创 重定位引入和链接脚本
大部分指令都是位置有关编码我们在设计一个程序时,会给这个程序指定一个运行地址。我们在写程序时,其实心里知道将来被运行时的地址的,而且必须给编译器链接器指定这个地址才行。最后得到的二进制程序理论上时和你指定的运行地址有关的(就叫位置有关代码)。但是有个别特别的指令他可以跟指定的地址没有关系,也就是说这些代码实际运行时不管放在哪里都能正常运行。
2024-04-03 09:13:20
166
原创 利用FreeRTOS驱动ILI9488液晶
从原理图中可以看到片选引脚为NE1,但是我用的是GD303,GD303的NE1对应STM32F1的NE2,所以片选选择NE2,a、打开Img2Lcd软件(有需要的可以私信我),点击左上角的打开按键,选择需要显示的图片;b、点击像素,将水平和垂直数据分别改为320和480,如下图所示。,所以将PA1设置为GPIO_Output,对应的参数默认即可,如下图所示。b、修改左侧栏最大宽度和高度,分别设置为320和480,其他设置如上图所示;RS在原理图中为A0,图片的格式为RGB565,所以数据位宽为16位。
2024-04-02 22:27:15
1808
原创 空闲任务(IDLE)
问:不创建任何任务,直接启动调度器会怎样?调度器会无任务可调吗?答:如果所有任务都处于阻塞、挂起状态,而没有一个任务是就绪的话,那调度器就没有用了。RTOS一定有一个用来垫底的任务,即“空闲任务”。它永远处于就绪状态,一旦所有任务都被暂停,空闲任务就会被调度器调用。我们可以把空闲任务称为“背景任务”。
2024-02-26 10:18:31
519
原创 C++的引用符号
#include<iostream>using namespace std;void swap3(int &pa, int &pb);int main(){ int x = 4; int y = 6; swap3(x, y); cout << "x = " << x << ", y = " << y << endl; return 0; } void swap3(int &
2024-02-26 09:01:04
470
原创 C++枚举enum
#include<iostream>using namespace std;//enum day{mon, thu = 2, wen};//完全写法 //enum class day:unsigned int {mon, thu, wen};//简写方法1//enum class day{mon, thu, wen};//简写方法2,没有创造命名空间 enum day{mon, thu, wen}; int main(){ day d1; d1 = day:
2024-02-26 09:00:48
127
原创 C++中子类和父类的兼容关系
C++中子类和父类的兼容关系子类是父类的超集,子类相当于可以裁剪成父类。按照这个逻辑,子类可以当父类来用,所输出的内容是父类的内容。#include<iostream>using namespace std;//定义父类class Person{public: int age; Person(){}; Person(int age); void speak(void);};//定义子类class Man:public Person{public: int
2024-02-26 08:58:59
251
原创 set的三种遍历
#include <iostream>#include<set>#include<algorithm>using namespace std; int main(void){ set<string> s1; s1.insert("cat"); s1.insert("dog"); s1.insert("horse"); //set的第一种遍历方法ranged_for for(auto s: s1) { cout <<
2024-02-26 08:58:36
439
原创 类模板特化示例
// 结论优先级:普通函数 > 模板函数的特化版本 > 模板函数的泛化版本 #include<iostream>#include<algorithm>using namespace std;template <typename T>class People{public: void func(T a) { cout << "in People func(T a),a = " << a << end
2024-02-26 08:57:22
108
原创 模板特化简单示例
// 结论优先级:普通函数 > 模板函数的特化版本 > 模板函数的泛化版本 #include<iostream>#include<algorithm>using namespace std;template <typename T>bool GreaterThan(T a, T b){ if(a > b) { return true; } else { return false; }}//对GreaterTha
2024-02-26 08:56:40
91
原创 lambda表达式
#include <array>#include <iostream>#include<algorithm>#include <iterator>using namespace std; int main(void){ [](){}(); [](){cout << "hello" << endl; }(); [](int i){cout << i << endl;}(5); auto
2024-02-26 08:56:20
123
原创 C++谓词
#include <array>#include <iostream>#include<algorithm>using namespace std; /*bool IsGreater(int a){ return a > 0;}*/// 用函数对象实现 class MyGreater{public: bool operator()(const string &s1, const string &s2) { r
2024-02-26 08:55:59
99
原创 C++的array容器类
定义array#include<iostream>#include<array>#include<string>using namespace std;int main(){ array<int, 3> a1; //定义了,但是没有初始化 array<int, 3> a2{1, 3 ,5}; //定义并初始化 array<int, 3> a3 = {1, 3 ,5}; //和第二种方法是一样的 arr
2024-02-26 08:55:34
100
原创 C++模板继承1
单参数模板继承#include<iostream>#include<string>using namespace std;template <typename T> class Person{public: T x;public: Person(){}; Person(T a):x(a){}; void print(void); };template <typename Ty> class Man:public Perso
2024-02-26 08:55:09
180
原创 “一次性”任务
比如:开机自检、开机后要在屏幕上显示一下LOGO、开机时需要播放一段用户指导视频等等。一定要显性调用xTaskDelete对无用任务进行删除!用xTaskDelete()删除动态创建的任务即可。,否则容易Hardware Failure系统崩溃。因为某些任务只运行一次。
2024-02-26 08:53:40
221
原创 APM姿态旋转理论基础
APM姿态旋转理论基础一、坐标系1.1 NED坐标系1.2 机体坐标系二、欧拉角三、旋转矩阵3.1 基本公式3.2 矩阵作差四、四元数4.1 四元数与轴角的相互转换4.2 四元数表示旋转4.3 四元数与旋转矩阵4.4 四元数与欧拉角一、坐标系无人机领域中最重要的就是惯性坐标系和机体坐标系。1.1 NED坐标系因为在现实中通常需要在平面控制无人机,因此NED坐标系通常作为无人机领域的导航坐标系使用。NED坐标系如下图绿色坐标系,即北东地坐标系,三个方向始终保持不变。1.2 机体坐标系机体坐标系
2024-02-25 16:06:07
858
原创 C++模板运算符重载
#include<iostream>#include<string>using namespace std;template <typename T> class Person{private: T age;public: Person(){}; Person(T a); //运算符+ Person<T> operator+(const Person<T>& other); //运算符+= Pe
2024-02-25 16:05:26
234
原创 C++类模板
#include<iostream>#include<string>using namespace std;//定义模板类template <typename T> class People{private: int age; public: People(){}; People(int a); void print(T x); }; template <typename T> People<T>::Peo
2024-02-25 16:05:10
215
原创 C++友元函数模板
#include<iostream>#include<string>using namespace std;//必须类和友元函数都要前置声明template <typename T1, typename T2> class Person;template <typename T1, typename T2> void print(const Person<T1, T2>& pn);template <typenam
2024-02-25 16:04:55
249
原创 C++友元函数
外部友元函数#include<iostream>#include<string>using namespace std;class Person{private: int age;protected: int height;public: string name; Person(){}; Person(int age, int height, string name); friend void dis_info(Person &pn);}
2024-02-25 16:04:32
118
原创 S5PV210时钟系统简介
MSYS:CPU、DRAM控制器、IRAM&IROMDSYS:都是和视频现实编解码等相关的模块PSYS:和内部各种外设时钟有关,比如串口、I2C、AC97、USB等为什么内部要分为3个域?因为210内部的这些模块彼此工作时钟速率差异太大了,所以有必要把高速的放在一起,相对低速的放一起。
2024-02-25 16:03:23
551
原创 C++static静态成员用法
#include<iostream>using namespace std;class Person{public: int age; static int height; static void print(int age);};// 静态成员变量和普通成员变量的区别是:静态成员变量需要在类的外面重新定义 int Person::height = 23;void Person::print(int age){// cout << "age = "
2024-02-25 15:58:40
201
原创 C++运算符重载示例
#include<iostream>using namespace std;class coordinate{public: int x; //x坐标 int y; //y坐标 coordinate(); //默认构造函数1 coordinate(int x0, int y0); //重载构造函数2 void print(void); //打印属性信息函数声明 //定义运算符+的重载 coordinate operato
2024-02-25 15:58:30
136
原创 C++拷贝构造函数
#include<iostream>#include<string>using namespace std;class Person{public: string name; int age; bool male; int *pInt; Person(){}; Person(string name, int age, bool male); //拷贝构造函数声明,拷贝构造函数的重点 Person(const Person& pn); ~
2024-02-25 15:58:21
113
原创 C++多继承二义性问题(菱形继承问题)
C++多继承二义性问题(菱形继承问题)这是多继承二义性问题的另一个常见问题,叫菱形问题。简单来说是,祖类为A,父类为B和C,子类为D,当我们想调用祖类A的成员时,编译器出现歧义的编译错误。解决方法:对父类进行虚继承祖类,看如下代码:#include<iostream>using namespace std;class A{public: void print(void);};//父类B虚继承祖类Aclass B:virtual public A{ };//父类
2024-02-25 15:58:11
145
使用GD32进行外部中断的示例
2024-05-27
中断中释放信号量要小心 I am FromISR
2024-04-23
FreeRTOS计数信号量示例代码
2024-04-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人