大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言main函数的正确写法,希望能对你有所帮助摘要:最近有粉丝说他是在校大学生,刚学C语言,看到main函数写法很多种,不知道哪种写法是对的,很是苦恼,想知道C语言的main函数到底标准写法是哪一种。说实话,一开始被问这个问题,一时半会儿也是回答不上来,平时做项目,也没仔细关注过这个。这不特意去学习了一下,也整理了一下,供参考。检测一下,你是否知道C语言main函数的这几种写法有何区别呢?一、main函数的介绍想必学过C语言的都知道,C程序的入口就是main函数,整个程...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断例程控制0X31服务介绍,希望能对你有所帮助一、例程控制服务介绍主要功能就是由客户端请求启动,停止ECU中的例程或请求例程结果简单介绍一下例程,就是一段写好的代码,可通过例程控制服务,去执行这段代码。例程有两种:1) 例程的开始和结束进行,由客户端对其进行控制,服务端仅负责接受和执行请求;2) 另一种是由客户端请求例程开始执行,但例程结束由服务端控制,可以是在诊断响应之前就结束,也可以在诊断响应之后再结束例程控制的应用场景:擦除内存,重置或学习自...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断清除诊断信息0X14服务介绍,希望能对你有所帮助一、清除诊断信息服务介绍0X14清除诊断信息服务,顾名思义是用来清除诊断信息的,可清除一个或多个ECU内存中的诊断信息。可清除单个DTC,可以按组清除DTC,也可以清除全部DTC。当清除诊断信息服务被完全处理时,服务端需发送肯定响应。即使没有存储DTC,也需要发送肯定响应。如果服务器在内存中支持DTC状态信息的多个副本(例如,一个RAM副本和一个EEPROM副本),则服务器应清除ReadDTCInformation状态报告服务使用的副本。其...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是国内版GPT & AI模型介绍,希望能对你有所帮助最近AI有多火就不用多说了吧,从GPT到AI作画,有多少热搜,想必大家都是知道的,更有大佬说AI是iPhone时刻。我觉得作为普通人,要抓住这个机会去暴富有点难,但是,我们可以去学习怎么使用AI,利用AI提升自己的效率,这个是很容易做到的。由于GPT的使用,门槛较高,“网络问题”把一大批人拦在了外面,最近国内各个大厂都在投入AI领域,目前已经发布了好几个了,我们可以使用国内的AI,虽然目前没有GPT强,但作为普通玩家也是够用的。...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是RTOS学习路线介绍,希望能对你有所帮助摘要:之前有粉丝问我RTOS的学习路线,本文从RTOS的概念,分类,特点和应用场景等多个维度去介绍RTOS,也提供了自己使用过的几个RTOS的官网,供读者参考。如有错误欢迎指正。一、什么是RTOS?RTOS(Real-Time Operating System),中文名为实时操作系统,是一种用于实时系统的操作系统。与通用操作系统相比,RTOS需要实时性能更好,而且需要更加可靠、安全和稳定。RTOS通常被应用在需要响应速度快、对时间要求严格的嵌入式系统中,例如航空航...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断通过DID读取数据0X22服务介绍,希望能对你有所帮助一、读数据服务介绍DID:Data Identifier 数据标识符,简单理解就是个编号,用来标识要读取的是什么内容,比如,你要读取软件版本号,硬件版本号,那发送的DID就不一样了。0X22服务的主要功能就是通过DID读取数据,可以请求一个DID的数据,也可以请求多个,其数量限制也由汽车厂商和供应商来约定。请求的DID数量,只要不超过数量限制即可,服务端在回复的时候要包含所有数据,也就是有多少个DID请求,就要回复多少个DID对...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断故障码控制0X85服务介绍,希望能对你有所帮助DTC控制服务介绍DTC全称:Diagnostic Trouble Code 诊断故障码,DTC控制服务,主要是客户端用来停止或恢复服务端中DTC状态的更新当服务端收到85服务后:如果控制信息是on,那么如果先前是off,就立即恢复到正常的状态,如果先前是on,保持状态不变。如果控制信息是off,则服务端应该立即停止DTC的状态更新。即从此刻起,DTC的状态信息保持不变。无论是发生了新的故障,还是当前的故障有了新的状态,服务端的DTC数量、状态信息都...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS访问时序参数0X83服务介绍,希望能对你有所帮助访问时序参数服务介绍这个服务我目前在项目中没怎么用到过,先来看看ISO14229的介绍Access Timing Parameter 服务用于在通信链路处于活动状态期间读取和更改通信链路的默认定时参数。此服务的使用很复杂,取决于服务器的能力和数据链路拓扑。每个诊断会话仅支持一个扩展时序参数集。由于服务器支持不同的扩展计时参数集,因此建议仅将此服务与物理寻址一起使用。建议使用以下服务顺序:DiagnosticSessionControl (diagnosticSessi...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断仪在线0X3E服务介绍,希望能对你有所帮助诊断仪在线服务介绍诊断仪在线服务比较简单,其功能就是告诉服务端,诊断仪还是处于连着的状态,不要切换状态。比如,当你想从默认会话模式切换到扩展会话模式,并保持在扩展会话模式时,此时可以周期性发送3E服务。因为,如果不在默认会话模式,超过S3时间,ECU就会自动切换到默认会话,3E服务可保持在你其他模式下。数据格式请求报文格式很简单,就两个字节,【SID】+ 【sub-function】子功能子功能为0X00的话,没有什么特殊的含...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言数组和指针的区别,希望能对你有所帮助一、数组和指针的介绍指针是一个变量,它存储了一个内存地址,该地址指向一个变量的存储位置。通过指针,可以访问和修改指向的变量。数组是一个由相同数据类型元素组成的集合,可以通过索引来访问和修改这些元素。二、两者之间的区别1,存储方式数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,数组的存储空间,不是在静态区就是在栈上。指针:指针很灵活,它可以指向任意类型的数据。指针p存...
最近AI有多火,就不用多说了吧,趁着这周末不加班,赶紧体验了一把,不得不感叹,确实有点东西,大有可为1. 首先注册一个Discord账号: 【官网】Discord官网:https://discord.com/输入用户名,进行验证需要输入电子邮箱和手机号(国内的手机号即可)进行验证验证通过验证通过后就是填一些基本信息填完后,设置一个discord服务器,这里选择亲自创建,或其他都可以,此处是选择艺术家和创作者也可以依次选择:亲自创建——仅供我和我的朋友使用——输入服务器名称——点击创建这个随便选择,最后给服务器设置一个名字即可至此discord账号注册完成了2. ...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断安全访问0X27服务介绍,希望能对你有所帮助安全访问简介什么是安全访问SecurityAccess 安全访问,27服务,用来保护某些诊断服务的,提供一种保护机制。例如对于重要数据的上传或者下载过程不做任何限制,可能会对整车的安全造成极大的威胁,尤其是针对底盘域的控制器更是要在这方面做好全方位的安全防保护措施。常用的应用场景:操控类,输入输出的控制,例程控制服务等,写入类,如烧录程序;产线写入重要的数据,如版本或标定信息,需要过27安全访问后,才进行数据的写入...
大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断ECU复位0X11服务介绍,希望能对你有所帮助简介ECU复位服务,其服务ID是0x11,主要功能是控制ECU执行复位动作,主要用于Client向Server(ECU)请求重启行为,该重启行为将会导致Server复位回归到特定的初始状态。报文格式1. 请求请求报文的数据格式如下表,格式比较简单,只包含两个字节,服务ID占一个字节0x11,子功能占一个字节,数据可取范围为0x00-0xFF。2. 子功能ECU复位服务在ISO标准中定义的子功能如下,常用的子功能有1和3两个,具体含义参见下表:肯定响应肯定响应...
基于STM32G030F6部分芯片烧录程序后无法识别也不运行之救砖笔记问题背景 使用STM32G030F6这颗ic作设计,程序中有设置L1级读保护。首次烧写全部显示成功,打算再次烧录时有极个别已经找不到芯片,其中不能再次烧入的板子程序功能都不正常。使用SWD的连接方式已经不能正常识别芯片了。其中设置L1级别的读保护代码片段如下:void FlashProtectCheck(void){ FLASH_OBProgramInitTypeDef OBInit; HAL_FLASH_Unlock(); HAL_FLASH_OB_Unlock(); HAL_FLASHEx_OBGetConfig(&OBInit); if(OBInit.RDPLevel != OB_RDP_LEVEL_1) { OBInit.OptionType = OPTIONBY...
关于使用stm32下载不进程序的各种奇葩记录在这里插入图片描述JLink Info: T-bit of XPSR is 0 but should be 1. Changed to 1.JLink Info: T-bit of XPSR is 0 but should be 1. Changed to 1. 烧入日志烧入错误识别不到设备。芯片有写保护,烧入不进在这里插入图片描述Device: STM32F103C8 VTarget = 3.269V State of Pins: TCK: 0, TDI: 1, TDO: 0, TMS: 1, TRES: 1, TRST: 0 Hardware-Breakpoints: 6 Software-Breakpoints: 8192 Watchpoints: 0 JTAG speed: 4000 kHzErase Failed! Error: Flash Download failed - "Cortex-M3...
本文目标:基于keil下的多文件夹打包生成LIB库的操作步骤按照本文的描述,应该可以跑通实验并举一反三。先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX使用外设:无前言 在一些情况中,刚踏入新公司接触到新工程时,公司的一些熟手不太方面展示源码,会在工程中添加lib的文件,这些打包的lib库文件中,或者是针对性优化的代码,或者是屎山代码,或者是量产打包的代码,或者是基于保密之类的留一手,或者是祖传代码,或者是别的什么缘由,总之在给定的工程中是能用的,就是看不到对应的源码,这个lib库怎么来的,今天就以一...
本文目标:基于stm32的基础实验按照本文的描述,应该可以跑通实验并举一反三。先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX使用外设:GPIO、SPI前言 跟着学习项目的一些笔记记录。实验目的 基于stm32的h5系列新建一个能使用的工程,进行spi屏幕的点亮。原理图部分 在这里插入图片描述所涉及引脚列表如下:在这里插入图片描述厂商芯片部分资料 找到屏幕的厂家提供的资料信息,查看对应的芯片手册,部分内容如下:在这里插入图片描述去看一下4线的spi是需要如何进行配置的,在这里插入图片描述时钟的时序频率:在这里插入图...
本文目标:基于stm32的基础实验按照本文的描述,应该可以跑通实验并举一反三。先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX使用外设:GPIO前言 跟着学习项目的一些笔记记录。实验目的 基于stm32的h5系列新建一个能使用的工程,点灯实验。原理图部分 在这里插入图片描述在这里插入图片描述搭建工程 启动 STM32CubeMX 后,点击如下图标开始选择 MCU:在这里插入图片描述点开之后,发现发现会下载一些东西,等其下载完毕即可,如下:在这里插入图片描述如下图输入型号“STM32H563RIV”,双击找到的芯片,开始创建工程:在这...
基于单片机bootloader的随笔 一、前言一直觉得做产品开发需要得考虑一些安全策略,一般的设计固件时会进行bootloader设计,而设计一个高效且安全的定制Bootloader需要考虑以下几个关键因素:1. 安全性首先确保Bootloader自身的安全性,例如通过以下措施:加密:使用加密算法确保固件在传输和烧写过程中的安全性。Bootloader需要能够解密接收到的固件。数字签名:通过签名验证确保烧录的固件是经过授权的。Bootloader应验证固件签名的合法性后才能烧录。锁定Bootloader:在生产烧录完成后,可以锁定Bootloader以防止未授权的代码执行。使用加密算法:...
FreeRTOS学习第10篇--队列使用示例本文目标:FreeRTOS学习第10篇--队列使用示例按照本文的描述,可以进行简单的使用队列。本文实验条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5设计实验 在本次实验中,继续沿用上一篇的工程文件,将输入通过遥控器获取的数据改用队列的方式进行实现。创建队列 函数原型QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );函数描述:函数 xQueueCreate 用于创建队列。第 1 个参数uxQueueLength是队列支持的消息个数,最多能存放多少个数据(item)第 2 个参...
FreeRTOS学习第9篇--队列介绍本文目标:FreeRTOS学习第9篇--队列介绍按照本文的描述,理解操作系统中的队列本文实验条件:理论学习篇1. 数据传输的方法1.1 任务之间如何传输数据多种方法比较:数据个数互斥措施阻塞-唤醒使用场景全局变量1无无一读一写环形缓冲区多个无无一读一写队列多个有有多读多写初学感觉消息队列挺麻烦,搞个全局数组不是更简单,其实不然。在裸机编程时,使用全局数组的确比较方便,但是在加上 RTOS 后就是另一种情况了。相比消息队列,使用全局数组主要有如下四个问题:1.使用消息队列可以让 RTOS 内核有效地管理任务,而全...
Nwatch在stm32上的移植本文目标:Nwatch在stm32上的移植按照本文的描述,应该可以跑通实验并举一反三。先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX使用外设:USART、IIC前言 NWatch是一个很漂亮的、基于STM32的开源手表项目,我这次学习是为了配合使用FreeRTOS而进行学习的。官方链接为:GITHUB:https://github.com/ZakKemble/NWatch作者博客:https://blog.zakkemble.net/diy-digital-wristwatch/实验目的 在stm32的平台上移植NWatch的代码,出于学习目的,移植一个游戏进行学习,方便后期继续进行学习FreeRTOS的相关...
本文目标:学习与使用FreeRTOS中的同步和互斥操作引子按照本文的描述,应该可以跑通实验并举一反三。本文实验条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5同步和互斥概念 同步用于控制任务执行顺序和时间,例如等待其他任务完成某项操作。互斥用于保护共享资源,确保一次只有一个任务能够修改或访问这些资源。实现同步和互斥的机制 任务通知(task notification):用于任务之间的等待和唤醒,可以传递数据和状态。队列(queue):用于传递数据,任务和ISR都可以放入数据,从中读出数据。信号量(semaphore):用于维持资...
FreeRTOS学习第5篇--任务优先级本文目标:学习与使用FreeRTOS中的任务优先级。按照本文的描述,应该可以跑通实验并举一反三。本文实验条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5任务优先级 每个任务都有一个优先级,用来决定哪些任务可以被执行。在FreeRTOS中任务优先级数值越小,任务优先级越低。不过有时也记不住,直接看封装层的信息比较好,在文件cmsis_os2.h中定义了相关的优先级,看英文意思就是越往后优先级就越高的。/// Priority values.typedef enum { osPriorityNone = 0, ///< No prior...
FreeRTOS学习第4篇--任务使用参数本文目标:学习与使用FreeRTOS中的任务参数。按照本文的描述,应该可以跑通实验并举一反三。先决条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5使用外设:USART1、GPIO、I2C实验目的 创建3个优先级相同的PrintTask任务,在任务中,使用OLED显示任务的执行次数。设计实验 在创建任务时,通过xTaskCreate或xTaskCreateStatic函数的pvParameters参数,将数据作为指针传递给任务函数。任务函数可以通过其入口参数pvParameters来获取数据。这种方法适用于传递静态或全局变量,或者只需要传递一次的...
FreeRTOS学习第2篇--创建任务(动态方法和静态方法)一、示例功能 基于我现有的硬件,完成一个多任务的编程。在本次示例中,创建了4个任务。4个任务分别是:StartDefaultTask、ColorLED_Test、PlayMusic、IRReceiver_Test。其中StartDefaultTask是翻转LED的值、ColorLED_Test是一个全彩的灯、PlayMusic是一个无源蜂鸣器播放孤勇者的任务、IRReceiver_Test是一个接收红外码值的任务。二、StartDefaultTask任务源码 void StartDefaultTask(void *argument){ /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ for(;;) { HAL_GPIO_To...
一、FreeRTOS简介 FreeRTOS是一个轻量级的实时操作系统,它提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。它适用于各种不同的硬件平台,并且可以灵活地配置以满足不同的应用需求。FreeRTOS具有可移植性、可扩展性和可维护性,因此被广泛应用于嵌入式系统和物联网设备中。二、FreeRTOS的优势 FreeRTOS 最大的优势就是开源免费,商业使用的话不需要用户公开源代码,也不存在任何版权问题,是当前小型嵌入式操作系统市场使用率最高的。有几下几个特点:免费和开源,遵循 MIT 许可协议,可以在商业和个人项目中自由使用和修改。可...
基于stm32的红外发射实验HAL库编程(美的)本文目标:基于stm32的红外发射实验HAL库编程(美的)按照本文的描述,应该可以跑通实验并举一反三。先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX使用外设:USART1、GPIO、TIM2前言 遥控器随处可见,是我们日常生活中常用的一种电子设备。它可以通过红外信号来控制电视、空调等家用电器的开关、模式、音量等功能。本文将介绍如何使用 STM32 单片机和 HAL 库来实现一个红外遥控器的发射实验,让你了解红外遥控的原理和编程方法。实验目的 基于stm32的红外发射实验HAL库编程(美的...
基于stm32(g0)实现低功耗(stop模式)中断唤醒实验本文目标:基于stm32(g0)实现低功耗(stop模式)中断唤醒实验按照本文的描述,应该可以跑通实验并举一反三。先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX使用外设:GPIO前言 在一些使用电池供电的场合中,经常会涉及低功耗的技术。低功耗技术是指通过一些手段,使得系统在不影响功能的前提下,尽可能地降低功耗,延长电池的使用寿命。STM32系列单片机提供了多种低功耗模式,其中最常用的是STOP模式。实验目的 本文笔者使用现有的硬件进行验证,看看是否能达到芯片手册上...
基于stm32使用usart发送实现HAL库DMA方式本文目标:基于HAL库的stm32实现usart的发送实验按照本文的描述,应该可以跑通实验并举一反三。先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX使用外设:USART1、GPIO缘起 这篇文章是在网上看博客时发现别人有一些有意思的验证,于是想在自己所处的平台也进行验证一下,顺便给一些初学者一些启发。实验目的 基于stm32平台使用HAL库方式实现usart的同步模式发送实验,顺便测试一下使用DMA方式的发送方式会不会影响cpu的实时性。在本实验过程中,我们将涉及 STM32 的 GPIO 端口配置、U...