黄瓜视频ios/seo zac
1、动态库、静态库介绍
参考博客:《静态库和动态库介绍以及Makefile》;
2、代码目录结构和编译脚本
参考博客:《实际工作开发中C语言工程的目录结构分析》;
3、编写库的流程
(1)明确需求:需求是否合理、需求的使用场景、需求可能遇到的出错情况;
(2)编写设计文档:功能实现的流程图、代码框架;
(3)设计文档的评审:开设计文档的评审会;
(4)编写对外提供的库头文件:拟定库对外的头文件;
(5)头文件的评审;
(6)创建代码的工程目录,编写代码;
(7)能编译出库文件后,编写测试demo程序;
(8)demo程序测试成功,交付库或者和相关模块进行联调;
(9)根据调试情况修改bug;
(10)上传代码,对外提供的头文件要上传到公共目录,采用映射的方式使用头文件;
3、注意事项
3.1、考虑代码规范性
(1)定义变量后注意要初始化,内存申请后先清零;
(2)内存申请后要判断是否成功,指针使用前判断是否为NULL;
(3)一个文件一般只定义一个全局变量,如果需要多个全局变量可以封装成一个结构体;
(4)初始化函数要考虑被重复调用的可能:记录下是否已经初始化成功,初始化成功之后被再次调用则直接返回成功;
(5)对外提供的库头文件要对每个函数和数据类型写清楚注释;库内部使用的函数和结构体只对重要的写注释;
(6)不对本文件之外提供的函数和全局变量用static修饰,定义成局部的;
(7)函数的传参,如果函数内部不需要修改或者不能修改,用const修饰;
(8)函数的大小一般不超过200行,太长的函数考虑拆分;
(9)函数的命名要规范,可以防止函数重名,一般是库的名字开头;比如函数名aaa_xxx:aaa是库的名字,xxx是函数的功能;
(10)尽量不要用数字来表示含义,用枚举来表示则逻辑比较清晰;
(11)函数对传参要做判断,特别是要判断指针是否为NULL;
(12)内存管理:注意谁申请谁释放的原则,不要造成内存泄漏;
3.2、考虑跨平台
(1)需要在不同机器架构间共用的头文件,要考虑32位、64位机器的数据类型所占字节数的差异,不用使用在不同位数机器中有歧义的数据类型;比如指针类型void *:在32位机器中是4字节,在64位机器中是8字节;
(2)如果库中调用linux的标准API,需要考虑这个API在不同的linux版本中是否有差异。可能有些高版本的linux已经不建议使用某些接口,有新的接口来替换旧的接口;
(3)结构体在不同的
3.3、考虑扩展性
(1)数据类型在定义时可保留一些字节;比如在定义结构体时,重要的、将来可能会添加元素的结构体可保留一些字节,将来扩展结构体时去占用这些保留字节,能保证结构体大小不会发生改变;
(2)函数接口保持一定的抽象性;比如将一些操作以函数指针的方式供上层调用,只定义函数指针的格式,将来可以很方便的替换掉函数指针的实体;
(3)定义函数接口时,要保留将来可能会用到但现在用不到的接口,保持架构的完整性。比如定义了库的初始化函数,对应要定义一个库的反初始化函数,虽然这个接口现在用不上,将可能会用到;
(4)库的头文件采用映射的方式,有利于同步;
3.4、考虑库的调试手段
(1)封装打印函数:区分一般打印、调试打印、出错打印,可以通过编译宏或者程序在运行时接收参数的形式,正常运行时关闭一般打印和调试打印,在需要调试时打再打开;
(2)可以将库的打印注册到内核的/proc文件系统中,效果可以参考海思芯片的"/proc/umap"调试手段;
(3)编译库时,Makefile添加"-g"选项,支持gdb调试;
(4)可以考虑错误码,不同的情况返回不同的错误码,便于定位问题;(错误码用枚举不要用纯数字)
3.5、考虑兼容性
(1)对外的头文件,使用基本的、通用的数据类型;比如使用int,不用使用自己封装的Int32等类型;
(2)对外头文件要低的耦合性,不用和其他的库绑定;
(3)C语言写的库,要兼容C++调用;具体参考博客:https://blog.csdn.net/weixin_42031299/article/details/126688788;
3.6、考虑库的交付
(1)在编译库时,把静态库和动态库都编译出来,让使用库的人自行选择;
(2)提供的demo代码,要写一个Readme文档,介绍使用方法;
(3)交互库时,最好以工程文件夹的方式提供,里面编写一个Makefile,让使用者可以一键编译出demo程序。推荐博友有机会熟悉下海思芯片的SDK开发包,里面的文档、脚本写的很详细,几乎就是一键编译;
推荐
给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转
相关文章:

C语言静态库、动态库的封装和注意事项
1、动态库、静态库介绍 参考博客:《静态库和动态库介绍以及Makefile》; 2、代码目录结构和编译脚本 参考博客:《实际工作开发中C语言工程的目录结构分析》; 3、编写库的流程 (1)明确需求:需求是否合理、需求的使用场景、需求可能遇…...

MyBatis-Plus分页插件和MyBatisX插件
MyBatis-Plus分页插件和MyBatisX插件六、插件1、分页插件a>添加配置类b>测试八、代码生成器1、引入依赖2、快速生成十、MyBatisX插件1、新建spring boot工程a>引入依赖b>配置application.ymlc>连接MySQL数据库d>MybatisX逆向生成2、MyBatisX快速生成CRUD申明…...

年前无情被裁,面试大厂的这几个月…
2月份了,金三银四也即将来临,在这个招聘季,大厂也开始招人,但还是有很多人吐槽说投了很多简历,却迟迟没有回复… 另一面企业招人真的变得容易了吗?有企业HR吐槽,简历确实比以前多了好几倍&…...

基于Java的分片上传功能
起因:最近在工作中接到了一个大文件上传下载的需求,要求将文件上传到share盘中,下载的时候根据前端传的不同条件对单个或多个文件进行打包并设置目录下载。 一开始我想着就还是用老办法直接file.transferTo(newFile)就算是大文件,…...

KDS安装步骤
KDS kinetis design studio 软件 第一步官网(https://www.nxp.com/ 注册账号下载set成功下载软件。 随着AI,大数据这些技术的快速发展,与此有关的知识也普及开来。如何在众多网站中寻找最有价值的信息,如何在最短的时间内获得最新的技…...

JavaSE-线程池(1)- 线程池概念
JavaSE-线程池(1)- 线程池概念 前提 使用多线程可以并发处理任务,提高程序执行效率。但同时创建和销毁线程会消耗操作系统资源,虽然java 使用线程的方式有多种,但是在实际使用过程中并不建议使用 new Thread 的方式手…...

开源代码的寿命为何只有1年?
说实话,如果古希腊的西西弗斯是一个在2016年编写开源代码的开发者,那他会有宾至如归的感觉。著名的西西弗斯处罚,是神话流传下来的,他被迫推一块巨大的石头上山,当登顶之后,只能眼睁睁看着它滚下去…...

完善登录功能--过滤器的使用
系列文章目录 Spring Boot读取配置文件内容的三种方式 Spring Boot自动配置–如何切换内置Web服务器 SpringBoot项目部署 上述为该系列部分文章,想了解更多可看我博客主页哦! 文章目录系列文章目录前言一、创建自定义过滤器LoginCheckFilter二、在启动类…...

CSS基础:属性和关系选择器
字体属性 color 文本颜色 div{ color:red;} div{ color:#ff0000;} div{ color:rgb(255,0,0);} div{ color:rgba(255,0,0,.5);}font-size 文本大小 h1 {font-size:40px;} h2 {font-size:30px;} p {font-size:14px;}注意:chrome浏览器接受最小字体是12px font-we…...

设计模式:原型模式解决对象创建成本大问题
一、问题场景 现在有一只猫tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom猫属性完全相同的10只猫。 二、传统解决方案 public class Cat {private String name;private int age;private String color;…...

驱动开发(二)
一、驱动流程 驱动需要以下几个步骤才能完成对硬件的访问和操作: 模块加载函数 module_init注册主次设备号 <应用程序通过设备号找到设备>驱动设备文件 <应用程序访问驱动的方式> 1、手动创建 (mknod)2、程序自动创建file_oper…...

《狂飙》大结局,这22句经典台词值得细品
最近爆火的热播剧《狂飙》大家都看了吗? 剧情紧凑、演技炸裂、豆瓣评分9.0,可以说是开年评分最高的一部国产剧。 虽然大结局了。 里面有很多经典台词,值得每个人细细品味。 01 这世界不缺梦想 有本事你就去实现它 02 你这么善良 怎么跟坏…...

【计算机网络期末复习】第二章 物理层
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为想复习学校计算机网络课程的同学提供重点大纲,帮助大家渡过期末考~ 📚专栏地址: ❤️如果有收获的话,欢迎点…...

多核异构核间通信-mailbox/RPMsg 介绍及实验
1. 多核异构核间通信 由于MP157是一款多核异构的芯片,其中既包含的高性能的A7核及实时性强的M4内核,那么这两种处理器在工作时,怎么互相协调配合呢? 这就涉及到了核间通信的概念了。 IPCC (inter-processor communication contr…...

【Rust日报】2023-02-11 从头开始构建云数据库 RisingWave - 为什么我们从 C++ 转向 Rust...
GTK4发布v0.60gtk4-rs代码库包含GTK4的Rust crates。还有个庞大的GObject库生态系统,其中许多库基于gtk-rs中包含的Rust绑定工具。 特别是:gtk-rs-core,一些核心库的绑定,例如 glib、gio、pango、graphenegstreamer-rs,…...

Linux驱动开发(一)
linux驱动学习记录 一、背景 在开始学习我的linux驱动之旅之前,先提一下题外话,我是一个c语言应用层开发工作人员,在工作当中往往会和硬件直接进行数据的交互,往往遇到数据不通的情况,常常难以定位,而恰巧…...

Spring MVC 之返回数据(静态页面、非静态页面、JSON对象、请求转发与请求重定向)
文章目录1. 默认情况下返回静态页面2. 返回一个非静态页面的数据2.1 ResponseBody 返回页面内容2.2 RestController ResponseBody Controller3. 实现登录功能,返回 JSON 对象3.1 前端使⽤ ajax,后端返回 json 给前端3.2 前端发送 JSON 的标准格式4. 请…...

leetcode-每日一题-2335(简单,贪心)
自己打表看一下过程就可以发现,其实就是每次选两个大的进行--之后秒数加1即可现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。给你一个下标从 0 开始、长度为 3 的整数数组 amount &am…...

Verilog语法之数学函数
Verilog-2005支持一些简单的数学函数,其参数的数据类型只能是integer和real型。 Integer型数学函数 $clog2是一个以2为底的对数函数,其结果向上取整,返回值典型的格式: integer result; result $clog2(n); 最典型的应用就是通过…...

【手撕面试题】JavaScript(高频知识点一)
目录 面试官:请你简述 var、let、const 三者之间的区别? 面试官:请你谈谈对深拷贝与浅拷贝的理解 面试官:输入URL的那一瞬间浏览器做了什么? 面试官:说一说cookie sessionStorage localStorage 区别&am…...

如何用PHP实现消息推送
什么是消息推送 通过服务器自动推送消息到客户端(浏览器,APP,微信)的应用技术。 2. 为什么要使用消息推送技术 通常情况下都是用户发送请求浏览器显示用户需要的信息。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据…...

电子学会2020年6月青少年软件编程(图形化)等级考试试卷(四级)答案解析
青少年软件编程(Scratch)等级考试试卷(四级A卷) 分数:100.00 题数:30 一、单选题(共15题,每题2分,共30分) 1. 执行下图程序后,“花名…...

DaVinci:调色版本
调色版本 Grade Version记录着片段的全部调色信息。将一种调色风格或效果,保存为一个调色版本,从而可在多个调色版本之间查看、比较、挑选或者渲染输出。调色版本类型本地版本Local Versions在没有创建新的调色版本之前,片段的调色信息默认记…...

【C++初阶】十二、STL---反向迭代器的实现
目录 一、反向迭代器 二、反向迭代器的实现 一、反向迭代器 之前的模拟实现vector、list 的时候,这些都是实现了正向迭代器,反向迭代器都没有实现,这里就要实现反向迭代器 反向迭代器也是适配器(配接器)的一种&#…...

day 43|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x < y。那么粉碎的可能结果…...

[SSD固态硬盘技术 0] SSD的结构和原理导论
版权声明: 本文禁止转载机械硬盘的存储系统由于内部结构,其IO访问性能无法进一步提高,CPU与存储器之间的性能差距逐渐扩大。以Nand Flash为存储介质的固态硬盘技术的发展,性能瓶颈得到缓解。1. 什么是SSD固态硬盘(Solid State Drives…...

Vue (3)
文章目录1. 数据代理1.1 回顾1.2 开始2. 事件处理2.1 v-on:click 点击事件2.2 事件修饰符2.3 键盘事件3. 计算属性3.1 插值语法实现3.2 methods实现3.3 计算属性实现4. 监视属性4.1 深度监视4.2 监视属性的简写形式4.3 watch 与 computed 对比1. 数据代理 在学习 数据代理 时 先…...

SQL语句,常用的DDL表操作语句
-- ddl sql 语句 -- 创建表 create table user_t( id int primary key auto_increment, -- 自增主键 name varchar(50) ); -- 查看表结构 desc user_t; desc user_test; -- 重命名表 alter table user_t rename to user_test; -- 查询数据库表 show tables; -- 添…...

C 语言 宏定义 :字符串化 stringify 的应用
字符串化 通过C 语言的宏(MICRO),可以把数值或者一段字符的组合,转换为字符串。 因为 C语言的宏在【预处理】阶段就展开了,所以可以实现一些比较使用的功能,比如一些数据的初始化操作 比如定义一个宏&…...

代替swagger的api接口神器
自动化API文档-APIFOX 文章作者:老杨 一:概述 大家在后端开发开发过程中,最痛恨的两天事情:1.写文档,2.别人不写文档。而我们后端开发,必定经历的事情就是要和前端&测试对接,我们需要把我…...