自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

weixin_45045399的博客

一步一脚印

  • 博客(57)
  • 资源 (1)
  • 收藏
  • 关注

原创 有限集合获取随机值-----洗牌算法

#include<stdio.h>#include<stdlib.h>#define max 20/*从一个有限的集合中随机取值,获取的值不重复取出,直到所有值都取出之后,重新计数arr:有限集合,随机值的取值范围pos:取出的随机值的标记,size:有限集合的大小return :有限集合中获取的随机值*/int GetRandomValue(int *arr,int *pos,int size){ int value,temp; if(*pos ...

2022-03-16 19:53:36 775

原创 USB转TTL(刷机或抓取log)各线颜色对应引脚

一般的颜色对应引脚:+5V电源线是红色 接地线是黑色 D+信号线是绿色 D-信号线是白色注意:如果把黑线(GND)接入设备的有电压的针脚上,加电会烧毁,所以接线前要准确确认设备的针脚,以免造成不必要的损失!...

2021-11-12 09:16:57 9098

原创 C语言中宏定义初始化结构体

在对结构体对象定义和初始化中,可以通过使用宏来快速达成结构,在使用过程中,应该注意宏参数名和结构体的成员名的冲突问题,宏参数名和结构体的成员名不能相同。typedef struct IIC_msg{ int addr; int len; char *msg; }fmsg_t;#define I2C1_ADDR 0x65#define I2C2_ADDR 0x35#define SIZE(arr) sizeof(arr)/sizeof(arr[0])#define I2C_C

2021-10-19 09:55:06 2995

原创 FreeRTOS移植到MCU上进入HardFault_Handler的原因

可能是在FreeRTOSConfig.h中给系统所分配的总的堆的大小超过了要移植的MCU的所能提供给用户使用的内存大小,即 #define configTOTAL_HEAP_SIZE ((size_t)(4*1024)) 分配过大 可能是在FreeRTOSConfig.h中给系统所分配的空闲任务的堆栈太小, #define configMINIMAL_STACK_SIZE ((uns...

2020-01-16 11:12:45 3687

原创 FreeRTOS任务通知、事件、信号量的对比

使用任务通知将事件或数据发送到任务比使用队列,信号量或事件组执行等效操作要快得多。同样,与使用队列,信号量或事件组执行等效操作相比,使用任务通知将事件或数据发送到任务所需的RAM要少得多。这是因为必须先创建每个通信对象(队列,信号灯或事件组),然后才能使用它,而启用任务通知功能具有固定的开销,镶嵌在任务控制块TCB中,如下:#if( configUSE_TASK_NOTIFICATIONS ...

2020-01-06 08:24:46 2509

原创 FreeRTOS事件组----任务同步

有时,应用程序的设计需要两个或多个任务才能彼此同步。例如,考虑一个设计,其中任务A接收一个事件,然后将事件所需的一些处理提供给其他三个任务:任务B,任务C和任务D。如果任务A在任务B,C和D已经全部完成了对上一个事件的处理,那么所有这四个任务将需要彼此同步。每个任务的同步点将在该任务完成其处理之后,并且无法继续进行,直到其他每个任务都完成了相同的任务。在所有四个任务都达到其同步点之后,任务A才能接...

2020-01-03 14:05:13 2791

原创 FreeRTOS事件组

事件组、事件标志和事件位事件“标志”是布尔值(1或0),用于指示事件是否发生。事件“组”是一组事件标志。事件标志只能为1或0,从而允许将事件标志的状态存储在单个位中,而将事件组中所有事件标志的状态存储在单个变量中;事件组中每个事件标志的状态由EventBits_t类型的变量中的一位表示。因此,事件标志也称为事件“位”。如果将EventBits_t变量中的某个位设置为1,则发生了该位表示的事...

2020-01-03 10:11:30 675

原创 FreeRTOS中断管理--计数信号量

计数信号量正如可以将二进制信号量视为长度为1的队列一样,将计数信号量视为长度大于1的队列。任务对队列中存储的数据不感兴趣,仅对队列中的项目数感兴趣。必须在FreeRTOSConfig.h中将configUSE_COUNTING_SEMAPHORES设置为1,才使能计数信号量。每次“给出”计数信号量时,都会使用其队列中的另一个空间。队列中的项目数是信号量的“计数”值。计数信号量通常用于两件事:...

2020-01-03 09:16:49 686

原创 FreeRTOS中断管理--二值信号量

二值信号量同步二值信号量(binary semaphroe api)的中断安全版本可用于在每次发生特定中断时取消阻止任务,从而有效地将任务与中断同步。这允许大多数中断事件处理在同步任务中实现,而只有非常快和非常短的部分直接保留在ISR中。如前一部分所述,二进制信号量用于将延迟处理“推迟”到任务。如上图 所示,如果中断处理的时间特别紧迫,则可以设置延迟处理任务的优先级,以确保该任务始终抢占系统中...

2020-01-03 08:24:48 2537 1

原创 FreeRTOS中断嵌套问题

任务优先级和中断优先级之间经常会出现混淆。中断优先级,即中断服务程序(ISR)相对于彼此执行的优先级。分配给任务的优先级与分配给中断的优先级没有任何关系。硬件决定ISR何时执行,而软件决定任务何时执行。响应硬件中断而执行的ISR将中断任务,但是任务无法抢占ISR。 支持中断嵌套的端口需要在FreeRTOSConfig.h中定义下表中详细说明的一个或两个常量,configMAX...

2020-01-02 15:40:08 2610 1

原创 FreeRTOS软件定时器

软件定时器用于在将来的设定时间或以固定频率定期计划功能的执行。软件定时器执行的功能称为软件定时器的回调函数。软件定时器由FreeRTOS内核实现并受其控制。它们不需要硬件支持,并且与硬件计时器或硬件计数器无关。软件计时器功能是可选的。包括软件计时器功能:1. 作为项目的一部分,构建FreeRTOS源文件FreeRTOS / Source / timers.c。2. 在FreeRTOSC...

2019-12-18 17:44:44 3584

原创 FreeRTOS中断管理--概述

概述嵌入式实时系统必须采取措施以响应源自环境的事件。例如,到达以太网外围设备的数据包(事件)可能需要传递到TCP / IP堆栈进行处理(操作)。非平凡的系统将不得不处理源自多个来源的事件,所有这些事件都将具有不同的处理开销和响应时间要求。在每种情况下,都必须对最佳事件处理实施策略做出判断:应该如何检测事件?通常使用中断,但也可以查询输入。使用中断时,应在中断服务程序(ISR)内执行多少处理...

2019-12-06 10:20:11 3134

原创 FreeRTOS堆内存管理

动态内存分配相关选项从FreeRTOS V9.0.0起,可以在编译时静态分配内核对象,或者在运行时动态分配内核对象。为了使FreeRTOS尽可能易于使用,这些内核对象不是在编译时静态分配的,而是在运行时动态分配的。FreeRTOS每次创建内核对象时都会分配RAM,并且每次删除内核对象时都会释放RAM。该策略减少了设计和规划工作,简化了API,并最大程度地减少了RAM占用空间。动态内存分配。动态...

2019-11-25 15:09:21 507

原创 数据结构与算法分析 C语言描述(原书第2版)(提取码:9uel )电子书pdf下载

数据结构与算法分析–c语言描述链接:https://pan.baidu.com/s/1Gg8Z9hALiXGSmUUoE9j14A提取码:9uel此版本是Mark Allen Weiss 著 冯舜玺译版本

2019-11-14 13:47:51 13699 22

原创 关于字符串的内存分布

char * globalHeader = "hello world";char globalArrayHeader[] = "hello world";void displayHeader(){ static char *staticHeader = "hello world"; char *localHeader = "hello world"; static char sta...

2019-11-11 13:41:18 221

原创 对于指针与数组

数组和指针的差别数组和数组指针在使用上有一些区别,本次使用的vector数组和pv指针定义如下:int vector[5] = {1, 2, 3, 4, 5}int *pv = vector;vector[i]生成的代码和*(vector+i)生成的不一样,vector[i]表示法生成的机器码从位置vector开始,移动i个位置,取出内容。而*(vector+i)表示法生成的机器码则是...

2019-11-10 21:34:29 102

原创 骑士走棋盘

描述:骑士旅游( Knight tour)在十八世纪初倍受数学家与拼图迷的注意,它什么时候被提出已不可考,骑士的走法为西洋棋的走法,骑士可以由任一个位置出发,然后走完棋盘上的每个位置解法:解法骑士的走法,基本上可以使用递回来解决,但是纯粹的递回在维度大时相当没有效率,一个聪明的解法由J.C. Warnsdorff在1823年提出,简单的说,先将最难的位置走完,接下来的路就宽广了,骑士所要走的...

2019-11-06 08:54:59 194

原创 暴力迷宫

迷宫解法:每个单元格的走法有上、左、下、右四个方向,在每前进一格之后就选一个方向前进,无法前进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止。#include<stdio.h>#define ARRAY_X 6#define ARRAY_Y 6int entrance_x = 0,entrance_y = 0; //入口int exit_x...

2019-11-05 10:46:48 119

原创 巴斯卡三角形

#include<stdio.h>#define N 8long combi(int n,int r){ int i; long p = 1; for(i = 1;i <= r;i++) p = p*(n-i+1)/i; return p;}int main(){ int n,r,t; for(n = 0; n <= N;n++) { ...

2019-11-04 16:49:43 90

原创 define中参数使用(#、##、...和__VA_ARGS__)

1. 用宏参数创建字符串:#运算符#define PUT_STRING(x) printf("the square of X is %d.\n ",((x)*(x)))

2019-10-29 09:54:13 1476

原创 关于CMSIS-DAP

CMSIS-DAPCMSIS-DAP是用于将调试端口连接到USB的调试单元的接口固件。在主机上执行的调试器通过USB连接到调试单元和运行应用程序软甲的设备。调试单元通过JTAG或SW连接到目标设备。ARM Cortex处理器提供coresight调试和跟踪单元。CMSIS-DAP支持包含一个或多个Cortex处理器的目标设备。配置CMSIS-DAP用于调试部分CMSIS-DAP JTA...

2019-10-25 15:21:56 12979

原创 堆栈

堆栈(stack)其特点是先进后出堆栈是最容易实现的ADT之一,其基本操作通常称为push和pop,push操作是把一个新值压入到堆栈顶部,而pop操作是把堆栈顶部的值移出堆栈并返回这个值1. 数组实现堆栈#include<stdio.h>#include<assert.h>#include<stdlib.h>#define STACK_SIZ...

2019-10-24 10:48:27 125

原创 关于setjmp和longjmp函数

现在可以讨论一下setjmp()和longjmp()的用途,因为它们是通过操纵过程活动记录实现的。许多程序员新手并不知道这个强大的机制,因为它是C语言所独有的。它们部分弥补了 C语言有限的转移能力。这两个函数协同工作,如下所示;setjmp(imp buf j)必须首先被调用。它表示“使用变量j记录现在的位置。函数返回零。longjmp(jmp bufj, int i)可以接着被调用。它表示“回...

2019-10-17 08:28:44 342

原创 关于可执行文件中的内存分段的那些事

对于可执行文件的内存,我们通过下面的程序来理解#include<stdio.h>int m; //0 0x404050 未初始化的数据段bssint n = 2; // 0x402000 数据段static int k; // ...

2019-10-16 16:20:03 205

原创 关于逗号运算符的影响--首次执行与再次执行的不同

在C语言中,有很多地方用到逗号运算符,如,数组元素赋值、枚举声明、单行多变量声明中都运用到。但是,其执行的效果可能有些不同,在数组元素赋值中,在最后一个元素的末尾加上一个逗号,如:char *atd[6] = {"hello world", "hi", "nice " " to", "meet", "you",};在上述程序中,在atd[2]和atd[...

2019-10-15 14:13:31 239

原创 一个数的每一位上的数字都是它的因数

问题描述:一个数的每一位上的数字都是这个数的因数如:128128 mod 1 =0128 mod 2 =0128 mod 8 =0那么你还知道有哪些数是这种特性的数呢?编程实现指定范围内的这种特性的数。#include<stdio.h>int l_,r_;void input_data(){ scanf("%d%d",&l_,&...

2019-10-14 13:51:02 167

原创 关于预定义宏

C标准规定了一些预定义宏,其具体演示如下://文件名:define_.cvoid function_f(){ printf("the date:%s\n",__DATE__); //预处理的日期 printf("the file:%s\n",__FILE__); //表示当前源代码文件名的字符串 printf("the line:%d\n",__LINE__); //表示当前源代...

2019-10-14 10:22:36 184

转载 C语言中的垃圾回收分析

C语言中的垃圾回收分析  摘要:C语言没有运行时库,无法自动压缩使用中的内存,缩小堆栈所需内存空间。若只申请内存,没有释放,势必造成系统内存不断减少、丢失。长时间的运行,最终导致系统死机。文章阐述了C语言垃圾产生的原因,并从引用计数、标记一清除算法两方面提出如何实现C语言的垃圾回收。  关键词:C语言;垃圾回收;引用计数;标记一清除算法  一般来说,操作系统记录了所有进程使用的全部资源,当系...

2019-10-12 16:04:53 890

转载 FSM----C语言

有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。FSM是一种逻辑单元内部的一种高效编程方法。状态机实现的方式有多种,下面讲述三种.1.使用if/else if语句实现的FSM使用if/else if语句是实现的FSM最简单最易懂的方法,我们只需要通过大量的if /else if语句来判断...

2019-10-11 11:28:21 553

原创 多重选择---switch和break

switch语句switch ($value$){ $case$}程序根据value的值跳转到相应的case标签处,然后,执行余下的语句,如果遇到break语句,则跳出switch语句,执行switch后的语句。其中,value和case标签的值必须是整数值,标签必须是常量或完全由常量组成的语句,否则,会直接执行switch语句后的语句。如: switch(Input) { ...

2019-10-10 16:48:23 108

原创 gdb调试

在需要gdb对程序进行调试时,首先,我们需要在编译时将调试信息加入到可执行文件中。我们可以使用编译器中的-g参数来实现。如:gcc -g hello.c -o hellog++ -g hello.cpp -o hello如果没有加入调试信息,将看不到程序的函数名、变量名,所代替的全是运行时的List of classes of commands:aliases-- Aliases of...

2019-10-10 14:02:05 93

原创 linux下的core dump功能的开启

1.基本概念当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core du...

2019-10-10 13:56:23 516

原创 gcc编译过程

GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。gcc不仅功能强大,而且可以编译如C、C++、Object C、Java、和Ada等多种语言,而且gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译.在一种计算机环境中运行的编译程序,能编译出...

2019-10-09 14:57:54 132

原创 C语言中按位运算符的应用

C语言中提供了按位逻辑运算符 '&' '|' '^' '~' 和移位运算符 ' >>' '<<'1. 按位与:&2. 按位或:|3. 按位异或:^4.按位取反:~5. 左移:<<6. 右移:>>应用: 1.掩码按位与(&)一般用于掩码(mask)。掩码主要是指对一些设置为1(开...

2019-10-08 16:43:28 1777

原创 指针操作--4个8位数重组为1个32位数据

#include<stdio.h>typedef unsigned char int8;typedef unsigned int int32;int8 input[5] = {1,1,1,1,0};int32 hst(int8 *ndsk){ int32 m = 0; int8 *h = (int8 *)&m; h[0] = ndsk[0...

2019-10-08 15:29:25 2865

原创 handle-exceptions: Error while dumping state (probably corrupted stack) segmentation fault

程序编译之后,运行程序出现以下错误:造成这种问题的原因有很多。如:1.int a = 5;int b = 0;a = a / b;如果程序代码这样,就会造成上面的错误,因为除数为零,违反了 '/' 运算符的右操作数(即:除数)不能为0的规则。2.访问不存在的内存地址在C语言中,segment fault通常是由于指针的错误使用,特别是动态分配,非关联化一个空指针总...

2019-09-29 09:26:48 391

原创 关于移位和乘除运算

有时候我们会看到程序中会用 “>>” 来代替 “/” 的运算,他们之间的关系是什么呢?如:int a = 4;int b = 4;a = a/2;b = b>>1;我们知道,最后a和b的结果相同,都是2通常,在程序中,如果需要乘(或除)2n,我们都可以使用移位的方式来代替,在大部分的C编译器和单片机编程中,用移位的方法的代码比使用乘除运算得到的代码的效率高...

2019-09-26 10:46:32 954

原创 typedef---对函数声明的理解

在C程序中,我们都喜欢用typedef声明来简化函数的写法,使得程序具有更高的可读性。如在C语言中的signal库函数中,有一个signal函数,其函数的原型为:void (*signal(int SIG, void(*FUNC)(int))) (int);如果对其直接声明,则是:void (*signal(int,void (*)(int)))(int);这样看起来就很...

2019-09-25 14:04:07 517

原创 关于C语言中的位域问题

C中的位域在数据存储时,有的时候我们不需要一个完整的字节来存储数据,只需要其中的一个或几个二进制位就可以完整的表达,特别是在嵌入式设备中,对内存中的管理尤其严格,因为在嵌入式设备中,内存是有限的,因此,需要程序员对内存进行严格管理,C语言中为了节省存储空间,提供了一种数据结构,即“位域” 或”位段“。位域的定义与结构体的定义一样如:struct bit_fields{ int a:...

2019-09-24 11:24:41 544

原创 数据存储

数据类型

2019-09-23 15:56:09 488

5.1多声道人声测试.wav

5.1各声道音源定位测试音乐,PCM编码,WAV输出!各个声道依次顺序发声,对比音箱摆位,可立即测试各声道是否输出工作正常,位置是否正确!

2020-07-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除