
C语言
锅锅是锅锅
这个作者很懒,什么都没留下…
展开
-
应用程序使用jlink的RTT功能收发调试数据
代码目录,RTT是需要移植的代码,Example是官方给的使用示例。在安装目录的示例代码里面,安装好jlink工具后自带。2.添加c代码和头文件路径到工程(汇编文件不需要)二、移植jlink驱动到项目工程。添加RTT目录下的代码到项目工程。初始化jlink-rtt。jlink rtt代码。jlink驱动安装包。原创 2024-06-27 09:57:29 · 714 阅读 · 1 评论 -
autosar软件分层架构组成--汽车电子
autosar是汽车软件协会制定的一套软件标准原创 2023-04-28 10:15:21 · 2396 阅读 · 1 评论 -
c语言按行读取文件
在做项目需要配置的参数一般保存在文件,读取文件配置比较简单的方法就是按行读取测试文件config.txt编译测试原创 2022-06-06 21:34:07 · 6526 阅读 · 1 评论 -
C语言三级指针用法
一、介绍三级指针主要用于传递多个字符串到函数外面二、程序示例#include <stdio.h>//鐘舵€佷笂鎶ユ帴鍙?int status1_read(char ***node, int *subnum){ const char *temp[] = {"status1", "value1", "123", "value2", "456"}; int i; *subnum = 2; *node = (char **)malloc(3*sizeof(char原创 2021-09-26 16:14:29 · 1402 阅读 · 3 评论 -
windows c api手册
手册地址http://www.office-cn.net/t/api/api_content.htm原创 2021-08-19 11:23:45 · 634 阅读 · 0 评论 -
C语言数据结构与算法-图的实现
一、介绍原创 2021-08-17 22:13:45 · 1348 阅读 · 0 评论 -
C语言数据结构与算法-二叉树实现
一、介绍原创 2021-08-17 18:00:38 · 353 阅读 · 2 评论 -
C语言宏定义制作函数模板
一、介绍当做协议栈或者批量化函数的时候,内容框架是固定的,如果要写1000个10000个函数确实手敲比较麻烦,一种是用工具批量产生这些函数,另一种就是宏定义,这里给出宏定义解决的方法,利用宏定义制作函数模板二、原理1、宏定义中##是一种分隔连接方式,它的作用是先分隔,然后进行强制连接例如:#define hello(x) hello##xhello(123) 等效 hello123#define A1(name, type) type name_##type##type 或#define A原创 2021-08-17 11:21:32 · 2810 阅读 · 0 评论 -
自己动手实现命令行解析器
一、介绍嵌入式里面经常会自己做命令行,这里分享一个命令解析器代码实现二、代码实现mycmd.c/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 头文件区~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/#include <stdio.h>原创 2021-08-11 18:02:04 · 1098 阅读 · 0 评论 -
c语言实现任务调度器
一、介绍调度器是常用的一种编程框架,也是操作系统的拆分多任务的核心,比如单片机的裸机程序框架,网络协议栈的框架如can网关、485网关等等,使用场合比较多,是做稳定产品比较常用的编程技术二、原理1、超级循环2、时间片与时标3、调度算法介绍1)时间片轮转调度2)强制试调度4、注意事项所有任务的执行时间不能超过时标的时间三、任务调度代码实现这里拿linux来测试schduler.c//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 头文件原创 2021-08-10 11:48:19 · 3823 阅读 · 1 评论 -
c语言实现http下载器
一、介绍最近做ota升级需要用到http下载,所以写了一下http下载器实现流程1、解析url网址的域名和文件名2、获取ip地址3、构建http请求头发送到服务器4、解析回复5、下载文件环境ubuntu linuxc语言main.c#include <stdio.h>#include "http_download.h"int main(int argc, char const *argv[]){ if (argc == 1) { p原创 2021-07-27 17:46:12 · 4577 阅读 · 4 评论 -
C语言可变参数宏定义
C99中:#define print_LOG(format, ...) fprintf(stdout, format, __VA_ARGS__)其中,…表示参数可变,__VA_ARGS__在预处理中为实际的参数集所替换GCC中同时支持如下的形式#define print_LOG(format, args...) fprintf(stdout, format, args)改进一#define print_LOG(format, ...) fprintf(stdout, format,原创 2021-07-05 09:15:45 · 871 阅读 · 0 评论 -
c语言调用cmd命令
一、介绍平时在命令行终端的命令除了直接敲也可以通过c语音来输入,方式就是c语音的system函数二、函数介绍#include<stdlib.h>int system(const char *command)command – 包含被请求变量名称的 C 字符串错误返回 -1,否则返回命令的状态三、windows使用示例#include <stdio.h>#include <stdlib.h>int main(){ system("ipconfi原创 2021-06-12 18:39:33 · 11534 阅读 · 1 评论 -
windows c定时函数的使用
一、介绍对应时间函数,c语言有标准库,但是要一直阻塞读取,这里介绍一种类似中断的处理方法,设置时间,时间到以后直接跳转到自己设定的函数里面执行,执行完以后返回当之前 的代码这里使用的ide:DEV C++二、函数介绍MMRESULT timeSetEvent( UINT uDelay , UINT uResolution ,原创 2021-06-04 17:22:54 · 1183 阅读 · 0 评论 -
TCP/IP调试利器 winpcap
一、介绍winpcap(windows packet capture)是windows平台下一个免费工具,通过它win32应用程序可以访问网络底层。用于windows系统下的直接网络编程。很多不同的工具软件使用Winpcap于网络分析,故障排除,网络安全监控等二、下载https://www.winpcap.org/devel.htm三、使用方法http://www.ferrisxu.com/WinPcap/html/index.html1、搭建工程2、添加库文件wpcap.lib3原创 2021-06-02 15:59:40 · 1472 阅读 · 3 评论 -
C语言结构体初始化的几种方法
一、介绍结构体作为数据结构的基础,经常使用,其中初始化也有几种方法,这里详细介绍二、常规初始化(先定义再初始化)typedef struct { int bandrate; int databits; int stopbits; int parity; int dtr;}serial_hard_config_def;serial_hard_config_def serial;serial.bandrate = 115200;serial.databit原创 2021-06-02 09:47:21 · 19685 阅读 · 0 评论 -
windows c线程编程
一、介绍线程简单理解就是并行执行,只不过是软并行,这里以windows为例作为介绍二、使用实例1、编写线程函数DWORD WINAPI ThreadFun(LPVOID pM) { while(1) { printf("hello guoguo\n"); Sleep(500); } return 0; } 2、创建线程 HANDLE handle = CreateThread(NULL, 0, ThreadFun, NULL,原创 2021-05-31 11:27:31 · 393 阅读 · 0 评论 -
windows c编写TCP通信
一、介紹有時候需要用windows写点小工具需要用到tcpip,这里介绍在dev c++下编写网络通信流程和linux差不多1、使用WSAStartup()函数检查系统协议栈安装情况2、使用socket()函数创建服务器端通信套接字3、使用bind()函数将创建的套接字与服务器地址绑定4、使用listen()函数使服务器套接字做好接收连接请求准备5、使用accept()接收来自客户端由connect()函数发出的连接请6、根据连接请求建立连接后,使用send()函数发送数据,或者使7、用re原创 2021-05-30 13:30:31 · 1969 阅读 · 1 评论 -
windows c编写UDP通信
一、介紹有時候需要用windows写点小工具需要用到tcpip,这里介绍在dev c++下编写UDP网络通信流程和linux差不多使用WSAStartup()函数检查系统协议栈安装情况使用socket()函数创建服务器端通信套接字使用sendto()函数发送数据,使用recvfrom()函数接收数据使用closesocket()函数关闭套接字最后调用WSACleanup()函数结束Winsock Sockets API二、工程配置添加库libws2_32.a三、udp源代码udp.原创 2021-05-30 12:27:40 · 3060 阅读 · 0 评论 -
windows c编写串口通信
一、介绍平时调试协议直接上其他平台不方便调试,这里以windows平台的c语言实现串口通信二、准备1、串口调试助手2、虚拟串口工具3、dev c++4、vscode(可以不用)三、代码实现main.c#include <stdio.h>#include "serial.h"#include <windows.h>int serial_test(){ PORT COM1; char buff[1024] = {0}; int rcv_原创 2021-05-28 11:43:32 · 15268 阅读 · 12 评论 -
自己动手实现TCP/IP--tcp协议通信(一)
一、介绍tcp/ip协议栈要深入理解,最好的方式就是自己写一遍基础的协议,这里以传输层的tcp为例介绍实现过程tcp特点提供了完善的错误控制和流量控制,能够确保数据正常传输,是一个面向连接的协议,建立连接通道,数据大小无限制速度慢,但是可靠性高二、整体框架此图片 来源于网络要实现tcp通信,必须实现tcp本身传输层,以及下面的网络层ip以及数据链路三、tcp协议帧框架图片来源网络四、各层协议格式1、数据链路层以太网头2、网络层ip头3、传输层tcp头4、arp5原创 2021-05-26 18:15:28 · 4279 阅读 · 0 评论 -
自己动手实现TCP/IP--udp协议通信(一)
一、介绍tcp/ip协议栈要深入理解,最好的方式就是自己写一遍基础的协议,这里以传输层的udp为例介绍实现过程二、整体框架此图片 来源于网络要实现udp通信,必须实现udp本身传输层,以及下面的网络层ip以及数据链路层三、整体协议数据帧框架此图片 来源于网络四、各层具体协议格式1、数据链路层2、网络层ip头3、传输层udp头4、要保持长期稳定通信还需要arp协议,回复arp包五、代码实现1、结构体定义//数据链路层//des 6byte + src 6byte原创 2021-05-17 17:40:32 · 1348 阅读 · 2 评论 -
卷积神经网络相关函数的实现--c语言
一、介绍这里主要介绍卷积相关函数用c语言实现,如卷积、池化、全零填充等等二、单核单通道卷积//单卷积 #define IMG_SIZE 5#define W_SIZE 3#define OUT_SIZE 3int conv(float img[IMG_SIZE][IMG_SIZE], float w[W_SIZE][W_SIZE], float out[OUT_SIZE][OUT_SIZE]){ int i,j,k,r,m,n; float tmp; //单张图片卷积 for(原创 2021-05-09 12:54:34 · 1788 阅读 · 0 评论 -
全连接神经网络手写体推理实现--c语言
一、介绍输入28x28的图片像素点范围0-1浮点数输出0-9的概率二、代码实现核心代码int my_predict(float *x, float *w1, float *b1, float *w2, float *b2){ float l1[64] = {0},l2[10] = {0},tmp = 0; int i,j,k; //第一层64个神经元 x 28x28 w 784*64个 b 64个 输出 64个输出 //w1x1+w2x2 ... wnxn+b printf(原创 2021-05-09 12:44:33 · 1044 阅读 · 0 评论 -
C语言实现bmp图片二值化
一、介绍二值化公式有很多这里用的手动阈值tmp1 = tmp1 > 127 ? 255 : 0;二、实现img_bmp.c#include <stdio.h>#include <stdlib.h>// bmp图片头大小 24位深度的 #define BMP_HEADER_SIZE 54void read_bmp (const char* filename, unsigned int** img_data, int *height, int *width)原创 2021-05-02 22:25:27 · 1611 阅读 · 1 评论 -
C语言实现bmp图片灰度化
一、介绍对于彩色转灰度:Gray = R0.299 + G0.587 + B*0.114二、实现img_bmp.c#include <stdio.h>#include <stdlib.h>// bmp图片头大小 24位深度的 #define BMP_HEADER_SIZE 54void read_bmp (const char* filename, unsigned int** img_data, int *height, int *width) { FIL原创 2021-05-02 22:20:06 · 1924 阅读 · 5 评论 -
C语言bmp图片读取写入
一、介绍bmp是我们常用的一种图片格式,这里用c语言写一个程序打开,读取像素点然后增亮增亮公式 y = kx + b二、实现img_bmp.c#include <stdio.h>#include <stdlib.h>// bmp图片头大小 24位深度的 #define BMP_HEADER_SIZE 54void read_bmp (const char* filename, unsigned int** img_data, int *height, int *原创 2021-05-02 22:07:59 · 4808 阅读 · 1 评论 -
c语言模块化分层编程基础--多文件编程
一、介绍在软件产品开发中,一个软件工程的代码量比较庞大,放到一个文件里面即不好调试也不好阅读,所以把代码分成多个文件就比较合适了—多文件编程二、三、原创 2021-05-01 13:04:12 · 909 阅读 · 0 评论 -
C语言数据结构与算法-二分法查找算法实现
一、介绍查找算法在实际编程中经常会使用,二分法查找速度较快,所以这里先列举二分法查找使用前提,要查找的数据已经排好序二、实现#include <stdio.h>int bin_find(int *buff, int len, int val) { int L,M,S; L = len-1; S = 0; while(S <= L ) { M = (L+S)/2; printf("L %d M %d S %d buff %d val %d \n", L,原创 2021-05-01 11:35:29 · 306 阅读 · 0 评论 -
C语言数据结构与算法-排序算法实现
一、排序算法介绍插入排序、冒泡排序、选择排序、快速排序、希尔排序、堆排序、归并排序、计数排序、桶排序、基数排序二、插入排序原理:新建一个数组或者链表,将要排序的数据逐个比对,插入新的数组或者链表里面void sort(int *data, int len){ int *tmp; int i,j; tmp = (int *)malloc(len*4); memset(tmp, 0, len*4);//清零 for(j = 0; j < len; j++) for(i =原创 2021-05-01 10:46:27 · 204 阅读 · 0 评论 -
C语言数据结构与算法-队列实现
一、介绍队列是一种存储方式,先进先出二、实现#include <stdio.h>#define QUEUE1_SIZE 5int queue1_len = 0;int queue1_mem[QUEUE_SIZE] = {0};int write_queue1(int *queue, int data){ if(queue1_len < QUEUE_SIZE) { queue[queue1_len] = data; queue1_len++; } else原创 2021-05-01 10:04:08 · 214 阅读 · 0 评论 -
C语言数据结构与算法-栈实现
一、介绍栈是一种存储方式,先入后出二、实现#include<stdio.h>#define STACK_SIZE 10unsigned char stack_mem[STACK_SIZE] = {0};int stack_len = 0;//压栈操作 int push_data(unsigned char *stack, unsigned char data){ if(stack_len >= STACK_SIZE) { return 0; } else原创 2021-05-01 09:37:20 · 198 阅读 · 0 评论 -
keil mdk解决不能识别二进制
keil mdk默认不支持二进制解决办法:可以自己添加头文件,如下#ifndef binary_h#define binary_h#define b00000000 0x0#define b00000001 0x1#define b00000010 0x2#define b00000011 0x3#define b00000100 0x4#define b00000101 0x5#define b00000110 0x6#define b00000111 0x7#define b00原创 2021-04-10 11:10:22 · 2201 阅读 · 1 评论 -
C数据结构与算法-链表进阶
一、介绍1、单向循环链表2、双向链表3、双向循环链表二、单向循环链表主要是将尾指针指向头节点1、定义typedef struct link{int data; //定义数据域struct link *next; //定义指针域,存储直接后继的节点信息}list_def;2、操作1.创建2.修改内容3.删除节点4.插入节点5.查看节点6.打印链表3、实例程序三、双向链表主要是多一个指针指向上一个节点1、定义typedef struct link{int dat原创 2021-04-03 11:38:45 · 172 阅读 · 0 评论 -
C数据结构与算法-链表
一、介绍相比于数组,链表结构是离散的,容易操作,数组插入需要将整个后面的数据后移比较耗时链表优点n个节点离散分配每一个节点之间通过指针相连每一个节点有一个前驱节点和一个后继节点首节点没有前驱节点,尾节点没有后继节点注意:链表使用必须要支持malloc等动态内存分配函数二、链表的定义方式1struct link{int data; //定义数据域struct link *next; //定义指针域,存储直接后继的节点信息};方式2typedef struct l原创 2021-04-02 16:55:05 · 265 阅读 · 0 评论 -
C语言接口封装方式--内联函数 inline
一、介绍当代码量庞大的时候,代码会分层,分模块编写,层与层之间会使用接口,常用的函数指针、内联函数、宏,这里以内联函数为例,内联函数区别于函数,函数会独立一段内存,执行的时候跳转到函数入口执行,然后返回,这个跳转过程会花费时间,对应执行频率比较高的函数,可以使用内联函数,等效看着define二、用法在函数前面加inline,要注意的是,内联函数不能使用if、while等语句#include <stdio.h>//函数定义为inline即:内联函数inline char* dbtest原创 2021-03-21 12:26:16 · 560 阅读 · 0 评论 -
C语言执行时间测量
经常遇到程序执行时间过长的时候,一般会优化程序的执行时间,优化之前需要先测量模块的执行时间,找出最占时间的函数或者模块1、时间函数测量头文件#include <time.h>函数使用gmtime函数获取格林尼治时间,函数原型:struct tm * gmtime(const time_t *)测量示例struct timespec ts1,ts2;float time_ms = 0.0f; //用于存储识别所需的时间int time_s;clock_gettime(CLOC原创 2021-03-21 12:15:37 · 943 阅读 · 0 评论 -
C语言内存管理--动态内存分配
一、介绍一般定义数组是要给固定的长度,当我们不知道输入的长度是多少的时候,怎么办例如:需求现在有一个电话本存储,电话本中联系人并不知道有多少,一次定义1000个长度会占用内存,定义太小又会导致存储不够c语音给了一种特殊的方式,动态内存分配二、函数介绍头文件#include <stdio.h>1、void *malloc(int num);在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的2、void calloc(int原创 2021-03-15 12:29:27 · 289 阅读 · 0 评论 -
C语言预处理指令实列三#error、#warning、#line
一、介绍#error、#warning、#line也是常用的调试利器#error 打印自定义的错误信息#warning 打印自定义的警告信息#line 设置文件和行号二、用法#error 要打印的信息 (不需要引号)#warning 要打印自定义的警告信息(不需要引号)#line 行号 文件名三、示例1、#error比如我们显示屏一般会宏定义宽度和高度,但是如果忘了编译器并不会报错可以通过如下方式实现报错#define LCD_WEIGHT 1024#define LCD_原创 2021-03-12 14:20:48 · 8883 阅读 · 1 评论 -
C语言预处理指令实列二#pragma
一、介绍#pragma 是一个很强大的预处理指令二、用法用法格式: #pragma 参数常用参数:1、once2、pack3、message4、alloc_text5、comment6、optimize7、auto_inline8、component9、inline_depth10、init_seg*11、bss_seg12、data_seg13、code_seg14、const_seg15、check_stack16、inline_recursion17、poin原创 2021-03-12 13:56:58 · 826 阅读 · 0 评论