![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c语言
文章平均质量分 59
腿毛都能控
自然规律,功能与物质的平衡
展开
-
单片机指令周期
一般STM32系统的外置晶振为8MHz,主时钟频率为晶振时钟的9倍频,即72MHz的时钟周期。1.25DMips/MHz就表示1秒每MHZ的速度能执行1.25M个Dhrystone指令。MIPS/MHz 表示 CPU 在多少MHz的运行速度下可以执行多少个MIPS。晶振频率12MHz,12个时钟周期 = 1个指令周期 =晶振频率12MHz,则时钟周期为。这里写一个stm32的延时函数。机器周期 = 晶振频率的倒数。原创 2022-09-24 14:09:50 · 1426 阅读 · 0 评论 -
队列与中断导致指针冲突问题解决
1.遇到问题最近在进行数据的接收时,单纯的使用数组接收,已经满足不了我的需求。所以在网上了解到可以使用队列进行对数据的存储,使用也很简单,代码量也不大,并且都贴有运行代码,我也尝试着执行了几个粘贴来的代码,确实是符合要求的,但有个问题,并没有被考虑进去,那就是在单片机中使用队列,出队或者入队是是会被中断打断的,此时若是使用指针进行数据的操作,效果可想而知,直接卡死,你若是能看到我这篇文章,很显然你也遇到了同样的问题,所以在想,不行就用数组对付接收,然后清除buf。简单而实用,但遇到问题怎可轻言放弃,接下来原创 2022-04-14 01:56:18 · 1036 阅读 · 2 评论 -
I2C协议
I2C 通信具有几类信号:开始信号 S当 SCL 处于高电平时,SDA 从高电平拉低至低电平,代表数据传输的开始结束信号 P当 SCL 处于高电平时,SDA 从低电平拉高至高电平,代表数据传输结束数据信号数据信号每次都传输 8 位数据,每一位数据都在一个时钟周期内传递,当SCL 处于高电平时候,SDA 数据线上的电平需要稳定,当 SCL 处于低电平的时候,SDA 数据线上的电平才允许改变应答信号 ACK/NACK应答信号是主机发送 8bit 数据,从机对主机发送低电平原创 2021-12-06 17:53:28 · 517 阅读 · 0 评论 -
linux内核架构解析-Linux文件与进程的关联
进程与其打开文件的关系如果说文件管理系统是文件的管理者与提供者,那么进程就是文件系统中文件的使用者。即,文件管理系统与进程之间是服务与客户之间的关系。文件对象当进程通过系统调用open()打开一个文件时,该系统调用找到这个文件后,会把文件封装到一个file结构的实例中提供给进程,这个实例称为file对象。struct file { union { struct list_head fu_list; //所有打开文件的链表 struct rcu_head fu_rcuhead原创 2021-08-27 09:37:36 · 300 阅读 · 0 评论 -
linux内核架构解析-内存管理
内存管理的实现涵盖了许多领域内存中的物理内存页的管理分配大块内存的伙伴系统分配较小块内存的slab、slub和slob分配器分配非连续内存块的vmalloc机制进程的地址空间系统启动start_kernel的代码流程图。内存管理相关的系统初始化函数。setup_arch是一个特定于体系结构的设置函数,其中一项任务是负责初始化自举分配器。setup_per_cpu_areas初始化源代码中(使用per_cpu宏)定义的静态per-cpu变量,这种变量对系统原创 2021-08-26 19:24:14 · 115 阅读 · 0 评论 -
linux内核架构解析-进程调度
分配给 CPU 的 task,作为调度实体加入到运行队列中。runqueue 运行队列是本 CPU 上所有可运行进程的队列集合。每个 CPU 都有一个运行队列,每个运行队列中有三个调度队列,task 作为调度实体加入到各自的调度队列中。参考微信公众号:人人都是极客...原创 2021-08-26 14:54:37 · 119 阅读 · 0 评论 -
linux内核架构解析-1基本知识
概述在接下来的日子里,我会去分析内核的主要功能,解析其内部的结构,并研究其实现,内核版本2.6.241.1 内核的任务内核是硬件与软件之间的一个中间层其作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址1.2 内核的组成部分粗略的草图,图中只是其中一部分1.3 进程、进程切换、调度操作系统下运行的应用程序、服务器及其他程序都称为进程。每个进程都在CPU的虚拟内存中分配地址空间各个进程的地址空间是完全独立的,因此进程并不会意识到彼此的存在。进程之间原创 2021-08-23 20:07:51 · 172 阅读 · 0 评论 -
命令行解析
board.c->start_armboot{ main_loop();}main_loop主要负责三个任务获取命令解析命令执行命令获取命令命令解析执行命令关键点分析(1)控制台命令获取(2)命令解析。parse_line函数把 “xxx” 解析成argv[0] = xxx, argv[1] = xxx argv[2] = xxx;(3)命令集中查找命令。find_cmd(argv[0])函数去uboot的命令集合当中搜索有没有argv[0]这个命原创 2021-08-16 23:16:02 · 765 阅读 · 0 评论 -
linux应用程序控制底层硬件原理解析
想要理解一个东西的本质,就要站在很高的层次上,去看清整体,明白整体是怎么回事,具体的细节可以不知道,可以不会写这个代码,不明白代码功能是怎么实现的,但必须从宏观的角度知道,这个东西大概是怎么回事原创 2021-08-08 15:21:52 · 2092 阅读 · 12 评论 -
嵌入式思维 、不深不浅的理解
主机:主要分为以下几个部分cpu计算机的心脏,负责运算显卡用于处理图像数据内存用于cpu和硬盘交换数据,进行临时存储硬盘 (固态或机器)所有文件均存储在此主板计算机的各部分插在主板上协同工作arm处理器相对电脑cpu。比如s5pv210。那cpu是如何将外设、内存等联系在一起的呢答:寄存器是cpu的硬件设计者制定的,通过查阅数据手册查阅相关寄存器寄存器与cpu有关寄存器包括两部分通用寄存器(37个)在cpu中特殊功能寄存原创 2021-08-04 21:39:05 · 437 阅读 · 1 评论 -
C与汇编的混合编程方式
上一期中,使用链表的方式进行对不同任务的调用,实现的效果还是不错的,但是,任务在进行过程中不能进行来回的切换,必须要执行完,这是一个弊端,若不使用实时操作系统的情况下,如何切换呢,那就要说一下万能的汇编了,用汇编则可以做到任务的切换首先我们知道,c与汇编的联合使用就三种情况,如下1. C语言内联汇编首先看一下代码__inline int ADD(int input1,int intput2){ int output; __asm{ ADD output,input1,intput2 }原创 2021-07-12 20:25:11 · 5728 阅读 · 12 评论 -
手写纯链表实现简易实时操作系统
首先查找资料,发现没有这种写法,要不就是跑裸机,把各个外设初始化,然后进入while1中,执行各种计算,这是裸机系统,更高级一点的是使用了内部中断与外部中断,进行pc跳转,进入中断,返回的while1继续执行后续循环。但是,这样的程序while中的逻辑与每个指令的调用次数的相同的,若有些计算不需要那么多的计算次数,而有些需要多次计算呢,解决办法是有的,有人会说,使用定时器中断啊,这确实是一个办法,但这种方式进行指针跳转,消耗的时间比较多,中断更适合进行一些flag标志类的触发条件,而系统大多是时间还是在w原创 2021-07-09 17:19:33 · 340 阅读 · 2 评论 -
C语言 枚举(enum)、宏定义(#define)、结构体(struct)的一种联合应用
#include <stdio.h>typedef enum ENUMDATE{ first=0x01, second=0x02, third=0x03}enumdate;//宏跨行,需要用续行符#define DATEDE \{ \ first, \ second, \ third \} \typedef struct DATE{ char first;原创 2021-07-08 16:00:38 · 267 阅读 · 0 评论 -
双链表测试代码
#include <stdio.h>#include <stdlib.h>#include "list.h"struct node{ int data; struct list_head list;};int main(){ struct node *first_node; first_node=(struct node*)malloc(sizeof(struct node)); first_node->data=1;原创 2021-07-08 14:42:48 · 168 阅读 · 0 评论 -
PID算法 c语言模板
typedef struct{ float Kp; float Ki; float Kd; int Error; int Last_Error; int Last_Last_Error; int Output;}pid_t;pid_t pid = { .Kp = 5.0f, .Ki = 5.0f, .Kd = 0.0, .Output = 0,};int func(int setting,int feedback){ pid.Error = s原创 2021-05-26 11:56:34 · 394 阅读 · 0 评论 -
卡尔曼滤波 c语言 模板
卡尔曼滤波算法C语言 代码编写/* R值固定,Q值越大,代表越信任测量值,Q值无穷大,代表只用测量值。 Q值越小,代表越信任模型预测值,Q值为0,代表只用模型预测值。*/double kalman_Filter(double Sensor_Value); typedef struct{ //属性 double P; //测量方差 double原创 2021-05-27 13:53:51 · 862 阅读 · 0 评论 -
内核的struct变量使用方法
typedef void (*pfunc_t)(void);typedef void (*pfunc_t)(int i);//定义一种类型 通过类型定义变量typedef struct { // 属性 int a; // 方法 pfunc_t func; }stu;//通过直接定义函数指针的方式,linux内核用的就是这种方法typedef struct { // 属性 int a; // 方法 void (*pfunc_t) (void); }stu;..原创 2021-05-13 12:52:39 · 115 阅读 · 0 评论 -
keil编译警告 #1296-D:extended constant initialiser used
/* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM *//* Suppress warning messages */#if defined(__CC_ARM)// Suppress warning message: extended constant initialiser used#pragma diag_suppress 1296#eli原创 2021-05-08 14:17:01 · 1099 阅读 · 0 评论 -
应用编程-线程 编程实践
进程的劣势1. 进程间切换的时间开销大2. 进程间通讯效率低进程与线程的关系一个进程可以有多个进程,内核调度的最小单元是线程,多线程之间的具有高的通讯效率默认进程下的线程创造#include <pthread.h>pthread_t th = -1;void *func(void *arg){ //代码段}ret = pthread_create(&th, NULL, func, NULL);gcc时要加 -lp原创 2021-04-04 22:12:22 · 146 阅读 · 0 评论 -
应用编程-文件IO
静态文件文件平时是存在快设备中的文件系统中如果没有文件系统,将要在扇区进行操作,这样的直接操作会很麻烦,所以我们用操作系统集成文件系统,文件系统有了之后,就可以用文件系统管理底层驱动的扇区我们把这种文件叫静态文件,什么是静态文件?静态文件是存在块设备中,尚未被打开的文件当我们open打开一个文件时:linux内核做的操作包括1. 内核在进程中建立了一个打开文件的数据结构,记录下我们打开的这个文件2. 内核在内存中申请一段内存,并且将静态文件的内容,从块设备中读取到内存中特定地原创 2021-03-31 21:59:27 · 133 阅读 · 2 评论