福州网站快速排名提升凡客诚品市场份额

news/2025/10/5 11:22:19/文章来源:
福州网站快速排名提升,凡客诚品市场份额,合肥形象设计工作室,小企业如何建网站摘要#xff1a;在看别人单片机程序时#xff0c;你也许是奔溃的#xff0c;因为全局变量满天飞#xff0c;不知道哪个在哪用了#xff0c;哪个表示什么#xff0c;而且编写极其不规范。自己写单片机程序时#xff0c;也许你也是奔溃的。总感觉重新开启一个项目#xf… 摘要在看别人单片机程序时你也许是奔溃的因为全局变量满天飞不知道哪个在哪用了哪个表示什么而且编写极其不规范。自己写单片机程序时也许你也是奔溃的。总感觉重新开启一个项目之前的写过相似的代码也无法使用得重新敲代码重用度不高编程效率低下代码无法积累。而且感觉写这个代码没有思想没有灵魂没有框架只是一个一个功能代码的堆砌很空泛。那么这个时候你也许应该在单片机中引入面向对象的思想了使代码更规范。一、单片机程序框架1、轮流执行int main (void) {while(1){sing();dance();play();} }函数sing执行的时间比较长的话函数dance就不能很快的被执行。任何一个函数死掉的话就会影响整个系统。2、前后台在使用 51、AVR、STM32 单片机裸机的时候一般都是在main函数里面用while(1)做一个大循环来完成所有的处理即应用程序是一个无限的循环循环中调用相应的函数完成所需的处理。有时候我们也需要中断中完成一些处理。相对于多任务系统而言这个就是单任务系统也称作前后台系统中断服务函数作为前台程序大循环while(1)作为后台程序。对应的编程代码大概是这样的:void EXTI_IRQHandler() {flag  1; } int main (void) {while(1){if (flag  1){do_something();flag  0;}} }有什么问题前后台系统的实时性差前后台系统各个任务(应用程序)都是排队等着轮流执行不管你这个程序现在有多紧急没轮到你就只能等着相当于所有任务(应用程序)的优先级都是一样的。但是前后台系统简单啊资源消耗也少啊在稍微大一点的嵌入式应用中前后台系统就明显力不从心了。3、多任务void first_task() {while (1){if(has_data())put_data();} } void second_task() {while (1){if(get_data())do_something();} }int main(void) {create_task(first_task);create_task(second_task);start_scheduler(); }多任务系统会把一个大问题“分而治之”把大任务划分成很多个小问题逐步的把小任务解决掉大任务也就随之解决了这些任务是并发处理的。注意并不是说同一时刻一起执行很多个任务而是由于每个任务执行的时间很短导致看起来像是同一时刻执行了很多个任务一样。二、执行的程序怎么写以按键为例点亮一个小灯1.常规写法int mian(void) {while (1){if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3)  GPIO_PIN_SET){printf(按键按下\r\n);}} }2.面向对象的写法首先我们把每一个按键都看成一个对象既然是对象就肯定有属性和行为比如我们定义一个学生那么这个学生有什么属性呢肯定有姓名、年龄、身高、体重对吧这些是一些基本的属性我们可以用一些单独的变量来定义它比如typedef struct {uint8_t  *name; //姓名(变量)uint8_t  age;   //年龄(变量)uint8_t  height;//身高(变量)uint8_t  weight;//体重(变量) } student_t;但是一个学生还有很多行为对吧它会唱歌、跳舞、打篮球、也会关注果果小师弟的公众号对吧于是我们就可以这样定义typedef struct {uint8_t  *name;  //姓名(变量)uint8_t  age;    //年龄(变量)uint8_t  height; //身高(变量)uint8_t  weight; //体重(变量)void (*Sing_song)(void); //会唱歌(函数指针)void (*Dance_latin)(void); //会跳舞(函数指针)void (*Wechat_zhiguoxin)(void); //会关注果果的公众号(函数指针) } student_t;好了这里我们提到了函数指针所以就来说一说函数指针。函数指针顾名思义它就是一个指针只不过它是一个函数指针所以指向的是一个函数。类比一般的变量指针指针变量实质上是一个变量只不过这个变量存放的是一个地址在32位单片机中任何类型的指针变量都存放的是一个大小为4字节的地址。重要的话说三遍牢记在心为什要记住函数指针因为在单片机面向对象编程中结构体的成员不是变量就是函数指针这两种类型。变量就不用说了函数指针理解就好。其实函数指针可以类比一般的变量看下面int   a;    void Sing_song(void); int * p;    void (*zhiguoxin)(void); pa;      zhiguoxin  Sing_song;左边走义变量a右边定义函数Sing_song;左边定义int指针右边定义函数指针;左边赋值指针右边赋值函数指针;那么函数指针怎么用呢我们还是以单片机为例把按键类比为一个对象这个按键有按键标志位有长按或者短按按键还有行为按键初始化、按键循环检测等。所以我们创建下面这样一个结构体当然这个结构体不一定仅仅有这些变量和函数这完全取决于你自己的定义你想怎么定义就怎么定义你甚至可以定义按键的颜色都。typedef struct {uint8_t  KEY_Flag;  //标志位(变量)uint8_t  Click;//按下(变量)void (*KEY_Init)(void); //按键初始化(函数指针)void (*KEY_Detect)(void); //按键检测(函数指针) } KEY_t;现在已经定义了KEY_t这种类型的结构体处理器还没有分配给这个结构体内存因为我们只是声明这样一个类型而类型是不占用内存的只有我们定义对应的结构体类型的变量时才会在占用内存空间。那么怎么定义一个结构体类型的变量呢KEY_t   KEY1;然后就要初始化结构体的成员变量了。KEY_t  KEY1  {0,0,KEY_init,KEY_detect};这里要注意了现在结构体有四个成员前两个普通的变量我们初始化为0还有两个函数指针我们是不是要把我们想写得函数的函数名字放在这里啊。那么聪明的你肯定知道还要定义KEY_init();和KEY_detect();这两个函数。这两个函数可以这样写。static void KEY_init() {GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin  GPIO_PIN_3;GPIO_InitStruct.Mode  GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull  GPIO_NOPULL;GPIO_InitStruct.Speed  GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, GPIO_InitStruct); } static void KEY_detect()  {uint8_t i  0; if(KEY1.KEY_Flag  1){HAL_Delay(100);if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)  GPIO_PIN_SET){printf(按键按下\r\n);}KEY1.KEY_Flag  0;} }好了具体函数中的代码我就不需要解释了。这样一个按键的对象我们就定义好了这个按键我们赋予了他生命有属性(变量)有行为(函数)。这样我们在主函数就可以这样的调用来实现相应的功能了。按键使用了中断这里并没有讲解。void main(void) {KEY1.KEY_Init();//初始化按键while(1) {  KEY1.KEY_Detect();//按键检测} }如果理解了这些那么面向对象的精髓你基本已经掌握了接下来就是不断地去练习和实践了。三、为什么要面向对象我们知道现有的编程范式主要是面向过程编程、面向对象编程、函数式编程。对于流程清晰的简单程序一般只有一条流程主线很容易被划分成顺序执行的几个步骤面向对象编程和面向过程编程没有太大差别并且面向过程编程常常比面向对象编程更加直观高效。但当我们面对一个大型的复杂程序由于其错综复杂的流程和交互关系很难将其简单地拆分成一条主线串成的简单步骤而通常表现为一个网状关系结构。这个时候面向过程编程的这种流程化和线性化的思维方式就会显得比较吃力而面向对象编程的优势就比较明显了。面向对象编程风格的代码更容易复用、扩展和维护、更高级、更人性化、更适合大规模复杂程序的开发。在Linux中就是用的面向对象编程里面有很多的结构体、指针、链表等等。如果还没有接触到面向对象编程只能说明你做的东西还不够复杂。在单片机举一个例子一块开发板可能会适配不同的屏幕:一块板子三个屏幕那么每一块板子肯定有不同的代码适配在程序中我们可以读出屏幕的ID然后通过if判断来执行不同的指令就行这样。果果小师弟如果使用面向对象编程那么就可以这样写代码。typedef struct lcd{uint8_t type;void (*LCD_Init)(void) }lcd_t, *plcd_t;int Read_id() {/* 0: LCDA* 1: LCDB*/return 0;  }int Get_Lcd_Type(void) {return Read_id(); }void LCDA_Init(void)//屏幕A初始化 {LCD_WR_REG(0xCF);  LCD_WR_DATA(0x00); LCD_WR_DATA(0xC1); LCD_WR_DATA(0X30);  }void LCDB_Init(void)//屏幕B初始化 {LCD_WR_REG(0X11);delay_ms(20);LCD_WR_REG(0XD0);LCD_WR_DATA(0X07);  }lcd_t openedv_com_lcds[]  {{0, LCDA_Init},{1, LCDB_Init}, };plcd_t get_lcd(void)//获取到屏幕类型 {int type  Get_Lcd_Type();return openedv_com_lcds[type]; }int main(void ) {plcd_t lcd; lcd  get_lcd();//获取到屏幕类型lcd- LCD_Init();//初始化对应屏幕while (1){}  }这里只是伪代码处理办法原理就和上面所讲的一样在结构体中使用变量和函数。到这里你应该掌握了面向对象得单片机编程方法一起来试验几个例子LED灯typedef struct { void (*LED_ON)(uint8_t LED_Num);     //打开void (*LED_OFF)(uint8_t LED_Num);    //关闭void (*LED_Flip)(uint8_t LED_Num);   //翻转 } LED_t;按键KEYtypedef struct {uint8_t  KEY_Flag;        //标志位(变量)uint8_t  Click;           //按下(变量)void (*KEY_Init)(void);   //按键初始化(函数指针)void (*KEY_Detect)(void); //按键检测(函数指针) } KEY_t;蜂鸣器BEEPtypedef struct {uint8_t Status;      //状态void (*ON)(void);     //打开void (*OFF)(void);    //关闭 } BEEP_t;串口UARTtypedef struct {USART_TypeDef *uart;/* STM32内部串口设备指针 */uint8_t *pTxBuf;   /* 发送缓冲区 */uint8_t *pRxBuf;   /* 接收缓冲区 */uint16_t usTxBufSize;  /* 发送缓冲区大小 */uint16_t usRxBufSize;  /* 接收缓冲区大小 */uint16_t usTxWrite; /* 发送缓冲区写指针 */uint16_t usTxRead;  /* 发送缓冲区读指针 */uint16_t usTxCount; /* 等待发送的数据个数 */uint16_t usRxWrite; /* 接收缓冲区写指针 */uint16_t usRxRead;  /* 接收缓冲区读指针 */uint16_t usRxCount; /* 还未读取的新数据个数 */void (*RS485_Set_SendMode)(void);  //RS-485接口设置为发送模式void (*RS485_Set_RecMode)(void);   //RS-485接口设置为接收模式 }UART_T;面向对象的单片机编程推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 文档 I/O 操作详解:从基础到高级应用

C# 文档 I/O 操作详解:从基础到高级应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

做企业网站需要哪些材料摄影的网站设计特点

使用HTML,CSS及JS实现注册功能中密码强度的显示&#xff0c;根据输入的密码判断并显示用户输入密码的强度等级是高还是低等。 效果演示 代码演示 html内容 <div class"container"><div class"userName-wrapper"><label for"userN…

想学做宝宝食谱上什么网站做软装找产品上哪个网站

概念ARQ:自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一.RTO:Retransmission TimeOutFEC:Forward Error Correctionkcp简介kcp是一个基于udp实现快速、可靠、向前纠错的的协议&#xff0c;能以比TCP浪费10%-20%的带宽的代价&#xff0c;换…

wordpress微信站wordpress tar.xz

以垂直列表形式显示的菜单。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 Menu组件需和bindMenu或bindContextMenu方法配合使用&#xff0c;不支持作为普通组件单独使用。 子组件 包含MenuIt…

2025提升门厂家最新企业品牌推荐排行榜,保温提升门,钢质提升门,消防提升门,分段式提升门,工业提升门公司推荐!

在现代工业高速发展的浪潮下,物流枢纽的高效运转、航空航天基地的精密作业,都离不开提升门这一关键基础设施。它不仅是空间通行的门户,更是保障行业安全高效运行的重要防线。然而,当下提升门市场品牌林立,产品质量…

360网站怎么做定制图片软件

目录 排序算法&#xff08;Sorting algorithm&#xff09;:) 一、定义 二、分类 三、评价标准 排序算法&#xff08;Sorting algorithm&#xff09;:) 一、定义 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的…

高考数学易错考点02 | 临阵磨枪 - 指南

高考数学易错考点02 | 临阵磨枪 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

知名建站的公司vi视觉设计手册

centos7&#xff0c;vbox复制出来的虚拟机无法ping通。其实这是vbox低版本没有解决的一个小问题&#xff0c;复制过去&#xff0c;主机的mac重新生成了(复制时候一定要选这个选项),但是配置文件的mac还是被复制的主机配置&#xff0c;网上搜索很多方案各种改&#xff0c;其实只…

培训销售网站建设wordpress安装提示500

礼帽运算是用原始图像减去其开运算图像的操作。礼帽运算能够获取图像的噪声信息&#xff0c;或者得到比原始图像的边缘更亮的边缘信息。 例如&#xff0c;图 8-22 是一个礼帽运算示例&#xff0c;其中&#xff1a; 左图是原始图像。中间的图是开运算图像。右图是原始图像减开运…

东莞本地招聘网站有哪些东莞公司注册官网

众所周知&#xff0c;知乎早在几年前就将推荐系统从 Python 转为了 Go。于是乎&#xff0c;一部分人就说 Go 比 Python 好&#xff0c;Go 和 Python 两大社区的相关开发人员为此也争论过不少&#xff0c;似乎&#xff0c;谁也没完全说服谁。 作者&#xff1a;hello架构 大概每…

网站实名认证功能怎么做公司变更地址流程

上一节&#xff0c;掌握了活动的创建&#xff0c;但是在启动器中点击应用的图标只会进入到该应用的主活动&#xff0c;那么&#xff0c;如何从主活动跳转到其他活动呢&#xff1f;显式IntentIntent有多个构造函数&#xff0c;其中一个是Intent(Context packContext,Class<?…

2025升降机厂家最新企业品牌推荐排行榜,固定式升降机,液压升降机,电动升降机,铝合金式升降机公司推荐!

在当前自动化、重型机械、精密设备等领域快速发展的背景下,丝杆升降机作为关键的机械执行机构,其市场需求持续增长。然而,行业内却面临着诸多亟待解决的问题。一方面,市场上丝杆升降机品牌数量众多,产品质量参差不…

在 2025 年安装 Visual Studio 2013

首先提醒一下,Visual Studio 2013 已经停止维护了,除非是怀旧或是某些特殊需求不建议使用这个版本,因此官网也只提供 Visual Studio 2015 的下载。 1.从下面的链接中下载 Visual Studio 2013 Ultimate with Update …

算法伦理与机器学习研究获PROSE奖

两位学者因《伦理算法》一书获得2021年PROSE奖,该书探讨了机器学习算法中的隐私保护、偏见消除等关键技术问题,为构建更安全可靠的AI系统提供了重要见解。某中心学者荣获2021年PROSE奖项 某中心学者兼宾夕法尼亚大学…

【Unity】相机 Cameras - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实验1 C语言开发环境使用和数据类型、运算符、表达符

实验1#include<studio.h> int main() {printf(" O \n");printf("<H>\n");printf("I I\n");return 0; }实验2 1 #include<stdio.h>2 int main()3 {4 double a, b,…

UiPath推出全新AI代理开发功能,简化自动化构建流程

UiPath在FUSION用户大会上宣布多项产品更新,包括AI代理构建器、Coded Agents支持、测试云增强等功能,帮助企业快速部署智能自动化解决方案,提升开发效率。UiPath今日在拉斯维加斯举行的用户大会UiPath FUSION上宣布…

2025年T型螺栓厂家TOP企业品牌推荐排行榜,光伏T型螺栓,不锈钢T型螺栓,地铁专用T型螺栓,高铁T型螺栓公司!

在 T 型螺栓行业,随着市场需求的不断增长,各类制造企业层出不穷。然而,产品质量参差不齐、技术水平差异较大、服务保障体系不完善等问题逐渐凸显。部分企业为追求短期利益,降低生产标准,导致产品在强度、抗振性等…

自己做网站怎么编代码快速免费建网站

为什么80%的码农都做不了架构师&#xff1f;>>> 多线程消费队列到指定个数时触发一个生产线程往队列中补充元素&#xff0c;保证队列中有足够的数据供消费&#xff0c;不至于使消费线程等待&#xff0c;也不至于在队列中堆得过多。假设10人消费&#xff0c;先放2个…

购买网域名的网站好住小帮装修案例

企业出海挑战与对策 随着全球化的加速推进&#xff0c;越来越多的企业开始将目光投向海外市场&#xff0c;以寻求更广阔的发展空间。然而&#xff0c;在出海的过程中&#xff0c;企业往往面临着诸多挑战&#xff0c;其中文化差异、法律限制等问题尤为突出。今天运营坛将对这些…