自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(81)
  • 收藏
  • 关注

原创 Win10系统下与VMware中Ubuntu20.04建立共享文件夹

ubuntu共享文件夹的设置

2022-12-16 22:01:58 2509 1

转载 树莓派4B更换清华源显示没有公钥报错

更换清华源,显示没公钥

2022-12-12 10:17:58 1124

原创 查找树莓派ip地址的几种方法

这个文件中可以看到树莓派 Raspbian 系统默认的主机名为 raspberrypi,所以可以在这里修改主机名,那么当树莓派接入网络之后,就可以使用 ping raspberrypi.local 来获得树莓派IP地址,当然也可以通过 http://raspberrypi.local 来访问树莓派的80端口上的 Web 服务(如果已经部署了的话)。从上面的图中可以看到树莓派是通过网线和win10电脑相连的,以此来共享win10电脑网络,但是需要在电脑端设置后才能将网络共享出来,命令将所有适配器的状态列出,

2022-12-11 11:26:21 23258 2

转载 基于消息的事件驱动机制(Message Based, Event Driven)

一、 基本模型概述基于消息的事件驱动机制是一个通用模型,广泛应用于桌面软件开发、网络应用程序开发、前端开发等技术方向中。本文主要描述基本模型、基本框架,用于说明不同技术的共性知识。可以理解为外部操作事件,被转化为消息存放于队列中;而每种类型的消息都有对应的处理;通过消息循环,完成读消息、调用消息处理这个过程。这个过程,只要应用不退出,会一直进行下去。下图的模型从Windows应用程序而来,但是具有一定的通用性。二、模型在MFC程序中的应用MFC(Microsoft Foundation Classe

2022-03-18 21:37:30 1233

转载 软件架构入门-分层架构、事件驱动、微服务架构和云原生架构

软件架构(software architecture)就是软件的基本结构。合适的架构是软件成功的最重要因素之一。大型软件公司通常有专门的架构师职位(architect),只有资深程序员才可以担任。O’Reilly 出版过一本免费的小册子《Software Architecture Patterns》(PDF), 介绍了五种最常见的软件架构,是非常好的入门读物。**软件架构就是软件的基本结构。架构的本质是管理复杂性。**如果你觉得架构不重要,可能是你做的事情不够复杂,或者是你没有管理好复杂性。架构模式

2022-03-18 20:40:29 1088

原创 汽车上下电流程理解

通常在我们的认知中,车辆是在拧钥匙或者按下启动按钮后启动的,但是实际上车辆中的大部分ECU在你按下解锁和开车门的时候已经起来,等候工作。那车辆中的电控单元是怎么被唤醒,以及新能源车中最重要高压系统是怎么上下电的呢?1. 整车上下电虽然控制单元可以IG ON、网络或者其他方式唤醒,不过就目前车辆上的ECU而言,大多数是采用网络唤醒,因为整车上有八九十个ECU,采用硬线控制会使总成本和重量都增加,而且通过网络控制更加灵活。通常的整车上下电流程如下:当钥匙按下解锁键或打开车门或按下启动键时,唤醒信号通

2021-11-24 08:41:45 20169

原创 CAPL编程

1. CAPL概述1.1、CAPL语言特性CAPL(Communication Access Programming Laguage)语言是类C语言,语法其实与C语言很相似,但同时又包含了一些C++的特性,如this指针、事件等;应用于Vector CAN工具节点的编程,是基于事件建模的语言;可以使用write()函数进行调试,用于将调试信息输出到CANoe的write窗口上;通过output()函数进行指定报文的发送;通常是通过环境变量事件与CANoe面板进行关联,实现交互;提供调用dll文

2021-11-11 08:40:12 18957

原创 SOTA机制详解

1.SOTA的定义SOTA即软件在线升级(Software updates Over The Air),是指在不连接烧写器的情况下,通过CAN、UART或其它通讯方式,实现应用程序的更新。在进行SOTA时,需要把旧的应用程序擦除,把新的应用程序写入。常规的实现方式需要分别开发BootLoader程序和APP程序,MCU上电先运行BootLoader,BootLoader根据情况选择是否跳转到APP和是否进行程序更新。具体来说有以下几种方式:方案一:更新程序时,由APP接收更新数据并暂存于Flash,再

2021-10-28 08:39:39 7173 2

原创 CAN总线错误帧详解

1.错误帧的帧结构在发送和接收报文时,总线上的节点如果检测出了错误,那么该节点就会发送错误帧,通知总线上的节点,自己出错了。错误帧由错误标志和错误界定符两个部分组成。主动错误标志:6个连续的显性位;被动错误标志:6个连续的隐性位;错误界定符:8个连续的隐性位。可以看到在错误标志之后还有0~6位的错误标志重叠,这一段最低有0个位,最多有6个位,关于这一段是怎么形成的,将在下文中解释。2.错误帧的检测2.1 位填充原则在了解CAN总线中的错误检测之前,首先需要了解什么是位填充。CAN协议中

2021-10-09 08:37:37 23500 17

原创 单片机内存及内存映射(本地地址,逻辑地址,全局地址)

16位单片机,最大寻址能力即2的16次方,65535/1024=64k,当flash内存大于64k时,地址怎么索引呢,即有了分页窗口的说法。本地地址,就是0到64k,在寻址范围内的地址,16k一页,共四页0x0000-0x3FFF(包含寄存器空间,D-flash,RAM,EEPROM)0x4000-0x7FFF0x8000-0xBFFF(分页窗口)0xC000-0xFFFF逻辑地址,就是指分页窗口的地址,可以索引到超过寻址范围的地址拿MC9S12G128来讲,128k,一页16k,共8页,地.

2021-09-27 08:39:12 4306

原创 CANoe编程实现FOTA车端的自动化测试(二)

这篇文章主要讲述在CANoe 11.0环境下,用CAPL编程实现仿真程序。1. 创建仿真节点建模之前,首先创建一个.DBC文件,也可以用一个已有的DBC文件修改。新建待仿真的空节点,如下图,只有节点名称无任何信号。然后加载到Setup。2. 插入新节点选择Insert Network Node, 然后右击新建的节点配置该节点属性。选择DBC中创建的节点名:设置节点属性为OSEK_TP节点(添加osek_tp.dll即可,在canoe安装目录下查找,例如 “C:\Program Files

2021-09-18 08:26:13 1844 1

原创 CANoe编程实现FOTA车端的自动化测试(一)

FOTA(Firmware Over-The-Air) 固件在线升级,包括车辆底层算法至顶层应用的综合升级,用户通过刷新程序进行 FOTA 升级,影响的是动力系统、ADAS 系统等,而SOTA(Software Over the Air)软件升级,一般是指离用户更近的应用程序、人机交互界面等功能的升级。1.汽车OTA流程车辆从主机厂服务器更新程序到指定ECU的过程中的主要部件。首先通过蜂窝网络建立车辆与服务器之间的安全连接,确保全新的,待更新的固件安全地传输到车辆的TelematicsUnit,然后再

2021-09-17 08:33:23 2655

原创 ARXML简介

在AUTOSAR架构下,ARXML文件作为通用配置文件或数据库文件,在数据传输和存储中起到关键作用,所以我们很有必要了解ARXML。因为ARXML是在XML基础上发展起来的,我就先从XML了解。1. XML和HTML的区别XML 被设计用来传输和存储数据,其焦点是数据的内容。HTML 被设计用来显示数据,其焦点是数据的外观。在xml文件的基础上,AUTOSAR规范基于汽车电子的应用场景,将传输信息的文件格式定义为arxml,ar即architecture。2.ARXML文件的结构ARXML文

2021-09-07 08:31:32 11021 5

原创 汽车ECU的bootloader程序设计

BootLoad(简称Boot)是一种启动加载程序,或者称为引导程序,我们在操作系统和嵌入式开发中经常用到,因为汽车ECU也是一种嵌入式系统,Boot程序主要用于ECU软件更新,汽车OTA升级,本文主要讲述汽车bootloader程序的工作原理和设计方法。一、bootloader的功能BootLoader,通常是驻留在ECU非易失性存储器(NVM,None Valitale Momory)中的一段程序加载代码,每次ECU复位后,都会运行bootloader。它会检查是否有来自通信总线的远程程序加载请求,

2021-09-03 08:38:16 2769

原创 结构体综合应用

#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXTITL 40 #define MAXAUTL 40 #define MAXBKS 10 typedef struct book{ char title[MAXTITL]; char author[MAXAUTL]; float value;}Book;char* s_gets(char*

2021-08-31 08:39:32 137

原创 指针数组,数组指针综合应用

#include <stdio.h>#include <string.h>#include <stdlib.h>int mysort(char** myptr1,int num1,char (*myptr2)[5],int num2,char*** ptr3,int* num3){ int i = 0; int j = 0; int k = 0; int len = 0; char** p = NULL; p =

2021-08-20 08:36:13 167 1

原创 strtko_r和strsep函数源码分析

strtko_r和strsep函数都是Linux下面的字符串切割函数,但是使用时有许多地方需要注意,分析库里的函数实现源码可以帮助我们更好的使用该函数。1.strtko_r函数源码由于众多的版本。这里strtok_r函数源码来自于GNU C Library:#include <stdio.h>#include <string.h>#include <stdlib.h>/* Parse S into tokens separated by characters

2021-08-17 08:33:33 574

原创 C语言中三目运算符省略中间参数的用法

在看别人C代码时遇到三目运算符(条件运算符) ’ ?:'省略中间参数的情况:#include <stdio.h>int main(int argc, char *argv[]){ int a = 200; int b = 0; b = a?:100;//---------❶ printf("a = %d b = %d\n",a,b); b = a > b ?:b;//--------❷通过printf函数打印b的值可知,在❶语句中三

2021-08-15 17:48:18 2288

原创 数组类型,数组指针类型,数组指针类型变量

1.数组的基础知识复习1.1 数组的定义:从数组元素的角度:相同类型的变量的有序集合;从内存角度:一段连续的内存空间;1.2 数组的初始化:可以指定长度,也可以不指定长度;可以直接用赋值符号给初值,或者用memset函数重置内存块;int tmp0[] = {1,3};int tmp1[20] = {0};//在编译时就将数组元素置为0memset(tmp1,0,sizeof(tmp1));//显示的将数组代表的内存空间置为01.3 关于数组的易错点:数组首元素地址和数组地

2021-08-12 09:06:13 668

原创 Autosar学习笔记—— (五)网络管理NM

汽车上ECU节点千千万万,不可能点火时所有ECU都开始工作,而是当用户需要请求相关功能时,参与该功能的相关ECU节点才需要启动起来,否则带来的只是过多对电池的无用消耗。为了更好的去利用整车的能源,防止出现不必要的电池浪费,网络管理(Network Management,以下简称NM)便可以很好的解决此类问题,最大可能的高效利用整车电池能源,节约用车成本,延长电池使用寿命。1. 网络节点类型一般而言,按照唤醒方式,我们可以将ECU网络节点类型划分为两大类:本地唤醒:唤醒源来源于自身模块,比如常说的KL

2021-08-05 08:32:18 3206

原创 字符串分割函数strtko,strtko_s,strtko_r

1.strtko1.1 函数原型char * strtok (char *str, const char * delimiters);参数:str,待分割的字符串(c-string);delimiters,分割符字符串。返回值:调用成功则返回指向被分割出片段的指针,失败返回NULL。功能:当在参数str的字符串中发现参数delimiters中包涵的分割字符时,则会将该字符改为\0 字符。1.2 使用说明delimiters是分割符字符串,不是字符,要用双引号;在第一次调用时,strt

2021-07-22 08:30:22 126

原创 字符串数组的三种形式

一、复习普通变量与指针变量的区别所有变量的基本属性:变量名称,值,地址(分配内存后获得)普通变量把 值 作为基本量,把地址作为通过‘&’运算符获得的派生量,而指针变量把 地址 作为基本量,把值作为通过‘*’运算符获得的派生量。——《C Primer Plus(第6版)中文版》P273二、字符串数组2.1 字符串在只读区,字符串地址在栈区字符串数组char* arry[]在栈上申请空间,存储字符串地址,字符串实际是存储在只读存储区,在排序时交换的是字符串地址。#include

2021-07-17 17:33:53 31051 2

原创 字符串和指针新领悟

”用双括号括起来的内容被视为指向该字符串存储位置的指针。“——《C Primer Plus(第六版)中文版》P322这句话怎么理解呢?只看主谓宾——用双括号括起来的内容视为指针。”用双括号括起来的内容“不就是字符串吗,所以有”字符串视为指针“。是这样吗?我们来看下面这个例子:#include<stdio.h>int main(){ char* pstr = "hello"; printf("pstr:%p\n",pstr); printf("pstr:%s\n",pstr.

2021-06-30 18:03:08 275 3

原创 everything软件使用技巧

1.指定文件目录搜索示例:TDDOWNLOAD\ abc 在所有TDDOWNLOAD文件夹下搜索包含abc字符的文件及文件夹TDDOWNLOAD\ *.jpg 在所有TDDOWNLOAD文件夹下搜索jpg后缀文件F:\TDDOWNLOAD\ abc 在F:\TDDOWNLOAD\目录下搜索包含abc字符的文件及文件夹F:\TDDOWNLOAD\ *.jpg 在F:\TDDOWNLOAD\目录下搜索jpg后缀文件注意:斜杠\后有一个空格,不能省略*:通配符,可以

2021-06-25 17:48:17 940

转载 Autosar学习笔记——(四)BSW之操作系统

Autosar学习笔记——(四)BSW之操作系统1. AUTOSAR OS特点2.AUTOSAR OS与OSEK OS的关系3. AUTOSAR OS的对象随着汽车电气化程度越来越高,电子控制系统越来越复杂(嵌入式系统,ECU),汽车软件呈现出任务多样化、周期复杂化、分层调用嵌套、多核系统引入等特点,为了适应这些新特点就引入了操作系统。它管理任务和事件的调度、不同任务之间的数据流,并提供监视和错误处理功能。操作系统为实时应用提供所有基本服务,包括中断处理、调度、系统时间和时钟同步、本地消息处理,以及错误检

2021-06-01 11:49:20 3352 1

原创 Autosar学习笔记——(三)诊断服务

https://zhuanlan.zhihu.com/p/74579897https://zhuanlan.zhihu.com/p/25198437https://blog.csdn.net/xyfx_fhw/article/details/997145262.3.1.1 诊断服务诊断事件管理器DEM诊断事件管理器DEM(Diagnostic Event Manager)是一个子组件,如同AUTOSAR内诊断模块的诊断通信管理器(DCM)和功能禁止管理器(FIM)。它负责处理和存储诊断事件(错误)

2021-05-26 21:04:16 4218

原创 Autosar学习笔记——(二)BSW模块

1. BSW的作用我们知道引入AUTOSAR软件架构的目的是为了提供一套优秀的底层代码库,使OEM在开发上层应用层软件的时不应考虑下层繁多的不同ECU型号,从而使汽车软件开发更加标准化、规范化、安全化、快速化和经济化。为了实现该目标,需要把这些不同型号的ECU封装起来,对外提供统一的接口,供上层软件开发时调用,BSW就是起这个作用的。2. BSW的结构在上篇文章中我们知道BSW又可以分成MCAL,ECUAL,SAL,CD四层,如下图所示每一层又提供不同的服务,下面将依次来介绍。2.1 MCAL硬.

2021-05-24 11:19:23 12209 1

原创 翻转字符串

#include<stdio.h>#include<stdlib.h>void InverseStr1(char* mystr){ if (mystr == NULL) return; char* headptr = mystr; int len = strlen(mystr); char* tailptr = mystr + len - 1; //for (int i = 0, j = 0; i < len / 2; i++, j++)

2021-05-07 14:51:35 295

原创 Autosar学习笔记——(一)Autosar概览

2021-05-07 08:09:49 1233

原创 计算机中shell是干什么的

参考文章Shell 是用来解决什么问题的?可以把 shell 理解为 命令解释器,用来解决用户如何与操作系统通信的问题(进行系统调用)。操作系统对外提供的接口是“系统调用”,也就是一堆编程用的接口。这些接口一般以C函数的形式暴露给使用者。通过这些接口,开发者可以命令操作系统“启动一个进程”,“查找某个目录下的所有文件”,“将某个文件的权限配置为744”等等。实际上我们平时编程用的是对系统调用的包装,比如libc里的那些库函数。但无论如何,你总是得写代码才能使用它们。为了不用使用电脑时每次都编写程

2021-04-28 14:39:57 1817

原创 C语言二级指针的应用

1.例1:void ChangeInteg(int* tmp){//int* tmp = &a//在子函数声明新的局部变量tmp,并让其指向a,即在指针tmp中保存a的地址,改变*tmp就相当于改变a *tmp = 20;}void ChangeStr(char** tmp){//二级指针(指针的地址)解引用得到一级指针(指针所指的对象)//指针本身是所指对象的地址,改变*tmp就相当于改变*b *tmp = "miss you,miss chen."}int main(){

2021-04-26 22:13:54 295

原创 autosar工具链

https://blog.csdn.net/weixin_39277045/article/details/85013551?utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-7.control&dist_request_id=1332030.10659.16190745140900825&depth_1-utm_source=distribute.pc_relevant.

2021-04-25 08:30:10 7291 1

原创 C/C++语言中的0、’0’、’\0’、”0”及NULL、nullptr异同

参考文章:c语言中的各种“零”C风格字符串结束符用作逻辑判断c语言中的0、’0’、’\0’、”0”及NULL

2021-04-20 22:31:03 2984

原创 关于找朋友的标准

先做朋友,有充分了解后再向恋人对象发展。能做朋友的标准:人品:善良,正直,真诚,诚信;善良:不会随便伤害别人,至少以后不会家暴;正直:不会作奸犯科,走歪门邪道,至少以后不会进牢房;真诚:不会口是心非,当面一套背后一套,也是深入交往的前提;诚信:不会随便欺骗撒谎,答应的事说到做到,让人放心;性格:可以阳光开朗,可以腼腆内敛,但要大度,理性,不能偏激,幽默更好,不强求。交流:是否有共同语言,能聊天聊得开心;互助:在工作生活上是否有帮助;能力:要有比较强的工作能力;从朋友角度:

2021-04-15 16:14:47 1411

原创 c语言实现去除字符串中空格

#include<stdio.h>#include<stdlib.h>//StrDec即是输入又是输出void CutSpace1(char* StrRes, char* StrDec){ int i = 0; for (; *StrRes != '\0'; StrRes++) { if (*StrRes != ' ') StrDec[i++] = *StrRes; } //使用数组的形式,而不是指针的形式,是为了方便得到数组首地址,方便显示赋值后的数组

2021-04-13 15:01:31 8731

原创 vs调试时不能单步调试,会跳过某些行

用VS2019在release模式下调试程序时,发现不能单步,会跳过某几行,最后发现是程序属性中优化设置的问题。这里只有选择“已禁用(/od)”时才会单步调试每条语句,debug模式下默认是“已禁用(/od)”。参考如何:调试优化的代码...

2021-04-06 01:48:53 3405

原创 C和C++中const变量内存分配问题详解

一、const变量的内存分配1.const全局变量,或者static,extern 关键字此时该常量是存放在.rodata段的—Read Only Data也就是常量区,是无法通过取地址方式去修改的,修改内容会报段错误(gcc++编译器:Segmentation fault(core dumped))。  例如extern const int i=10,  static const int i=10。2.const局部变量在C语言中,const局部变量在栈分配内存,不能通过赋值,自

2021-04-06 01:25:13 5685 4

原创 从例子中认识内存模型

/*知识点:1,冒泡排序;2,数组作为函数参数时会退化成指针;3,数组a 和 &a 的含义,a+1, &a+1的大小;4,sizeof的用法:sizeof(对象);sizeof(类型);*/#include <cstdio>void PrintArrayElement(int* a, int num, const char* b){ //int num = sizeof(a) / sizeof(a[0]);在这里a只是指针,不是数组,数组做参数的

2021-03-29 08:16:13 78

原创 C/C++程序运行时内存模型

1.C++内存模型(堆栈全常代 ):堆 heap :保存程序中动态分配的内存,比如C的malloc申请的内存,或者C++中new申请的内存。堆向高地址方向增长。由new分配的内存块,其释放编译器不去管,由我们程序自己控制(一个new对应一个delete)。如果程序员没有释放掉,在程序结束时OS会自动回收。涉及的问题:“缓冲区溢出”、“内存泄露”栈 stack :是那些编译器在需要时分配,在不需要时自动清除的存储区。存放局部变量、函数参数。存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返

2021-03-26 19:20:45 868

原创 汽车诊断协议的命名

学名别名PR_KWP2000OnTP20VW-CanPR_KWP2000OnTP16CanKwpPR_KWP1281OnKLineBoschPR_UDSOnCanUDS

2020-09-01 22:48:06 232

空空如也

空空如也

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

TA关注的人

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