当前位置: 首页 > news >正文

个人空间网站建设wordpress用户投稿

个人空间网站建设,wordpress用户投稿,东莞最新一例阳性,网站建设费算办公费吗搞单片机,MCU:STM32/GD32/HC32,通讯模组:4G/WIFI/BT/433,总线:USB/CAN/K/232/485,各种常见的传感器,都接触过。 一开始学习单片机的时候没有形成很好的编写习惯,如LED点亮/熄灭/闪烁…

搞单片机,MCU:STM32/GD32/HC32,通讯模组:4G/WIFI/BT/433,总线:USB/CAN/K/232/485,各种常见的传感器,都接触过。

一开始学习单片机的时候没有形成很好的编写习惯,如LED点亮/熄灭/闪烁控制都是有一个功能新增一个函数,外面直接调用这个函数。
其实模块化的东西,就应该模块化。如同Linux的底层驱动,都是先注册一个设备类型,实现初始化、读写和控制函数。对外部只提供一个结构体指针(里面包含函数指针)。

这里就记录和分享一下驱动框架:

首先是.c和.h文件结构

  1. Include files
  2. Local type definitions (‘typedef’)
  3. Local pre-processor symbols/macros (‘#define’)
  4. Local variable definitions (‘static’)
  5. Function implementation - global (‘extern’) and local (‘static’)

.c文件应该包含以上5个部分,.h文件包含4部分(不包括static)
static:代码中内部实现的子函数、不需要外部访问的变量,都应该限制其作用域,只允许在本文件内访问。包含因代码逻辑处理或运算而定义的宏定义和宏函数也应该在本文件内定义。

其次是typedef和define

  1. typedef
    在.h文件中应该根据设备的硬件结构和配置寄存器定义一个合理的结构体,让外部调用函数指针。

如W25Q256的驱动文件可以分成2层:
一是整体驱动文件,二是功能驱动文件。

在功能驱动的.h文件中
定义了如下这么一个结构体,
typedef struct {
void (*Delay)(uint32_t);
void (*Init)(void);
void (*DeInit)(void);
void (*Active)(void);
void (*Inactive)(void);
int32_t (*Trans)(const uint8_t *, uint32_t);
int32_t (*Receive)(uint8_t *, uint32_t);
} stc_w25qxx_ll_t;
其对应的驱动函数,
int32_t W25QXX_Init(const stc_w25qxx_ll_t *pstcW25qxxLL);
int32_t W25QXX_DeInit(const stc_w25qxx_ll_t *pstcW25qxxLL);
int32_t W25QXX_GetManDeviceId(const stc_w25qxx_ll_t *pstcW25qxxLL, uint16_t *pu16ID);

可以这样总结:
1、功能驱动的.c文件基本是不包含静态变量或全局变量的,只关注于实现W25Q256对应的寄存器功能,如基本读写/擦除/获取ID/初始化等函数。借鉴下来,对于硬件模块,功能驱动文件应该只关注实现细分子功能。而不应该将上层应用的实现直接放到驱动层里面来。
2、功能驱动的.c文件的函数都要有一个底层驱动的结构体指针传进来,底层驱动无非就是初始化、读写、控制,将之封装成结构体函数指针,也尽量不包含静态变量或全局变量。供上层调用。
3、这个功能驱动文件应该是一个只需要include stdint.h、string.h的代码文件,就是模块化。

  1. define
    对于底层驱动:
    1、应该是尽量减少define定义,只关注于实现基础函数。
    2、需要实现define定义的:
    1)硬件的规格参数
    2)宏函数

对于功能驱动:
1、应该包含硬件寄存器相关的定义
2、包含相关硬件规格定义

多少个C文件

最简单的,一个C文件搞定。只提供结构体指针来调用内部的接口。
这样能做的就是,合理的设计和拆分子功能,不要出现多个接口代码类似的情况。
当然.h文件要包含必要的宏定义、宏函数和错误码、状态定义等等

两个C文件,这样搞一般是有多型号、微差别的模块,可以将功能驱动抽象出来。
如W25QXX系列,差别在于存储容量、单元大小会有不同。
这个功能驱动文件是一个标准的c文件,理论上可以在不同平台和环境使用。
最终实现是在整体驱动文件中:实现底层驱动函数和结构体指针,调用功能驱动文件实现功能。

三个C文件,则是更进一步的细分:
1、底层驱动文件
只实现底层驱动文件,属于更换编译器、芯片平台时需要修改的文件。
2、功能驱动文件
同上。逻辑抽象好之后基本不需要修改的文件。
3、整体驱动文件
引用底层驱动和功能驱动,实现上层应用需要的接口函数。

由此及彼

  1. CAN驱动
    1)一个CAN驱动首先是根据CAN ISO11898等协议,制定和拆分功能驱动文件。实现如总线初始化、总线接收配置,发送和接收回调、读取接收等函数。
    2)根据芯片平台的不同,制作底层驱动文件,实现基本驱动接口
    3)根据上层应用,或简化,或逻辑组合调用,实现上层功能接口
    这样,
    老项目换主控芯片,只需要修改底层驱动文件;
    相同芯片开发新应用,只需要修改上层功能接口;
http://www.yayakq.cn/news/661083/

相关文章:

  • 外国人做那个视频网站吗利于优化的网站模板
  • wordpress滑动插件兰州企业网络优化服务
  • ps做网站主页的效果图有趣的网站代码
  • 自助免费网站制作全国做网站的大公司有哪些
  • 网站优化一年多少钱泉州城乡建设网站
  • 外贸建站与推广如何做 googleandroid网站开发视频教程
  • 要求维护公司做网站整改的函万州论坛网站建设
  • 北京网站建设报价明细微分销平台登陆
  • 房屋在线设计网站建设网站需要哪些域名
  • 有没有国外的做美食的视频网站网站制作1
  • 加强门户网站建设方案企业网站建设收费
  • 关于做ppt的网站有哪些内容吗建设通网站是什么时间成立
  • 如何建立公司企业网站网站开发公司郑州
  • 网站开发的体会注册网站英语怎么说
  • 好的网站推荐局门户网站的建设
  • 网站模版如何建qq官方网页版登录
  • 上海网站开发团队广州市省建设厅网站
  • 建站哪家好佛山宣传片制作
  • 石林彝族网站建设营销型网站建设哪里济南兴田德润优惠吗
  • 备案关闭网站plone vs wordpress
  • 上海 网站设计wordpress 阿里oss
  • 建设部网站申请表无法打印怎么找做网站的外包公司
  • 电商网站建设需求营销类型的公司网站
  • 做外贸铝材哪个网站比较好php ajax网站开发
  • 网站手机端生成瓷砖网络推广培训
  • 贵阳58同城做网站公司有哪些高校支付网站建设费需要入无形资产
  • 上海网站建设价wordpress封装小程序
  • 怎样进入网站的后台企业建网站的 程序
  • 免费个人简历制作网站什么软件做美食视频网站好
  • 湖南湘信建设工程有限公司网站wordpress前台弹窗