hardware simulation——框架搭建

2024-01-14 09:44

本文主要是介绍hardware simulation——框架搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

引子

代码风格约束

代码结构和模板


引子

前几天有人拿个word文档,问我怎么实现,概括一下就是用c实现数码管显示。

 但是咱们肯定不做这么简单这么点,我打算做个开源的项目,可以一直更新底层软件库,和上层显示库,目标就是所有的硬件都能模拟。今天主要是搭建个框架,视频在B站。

000代码框架搭建_哔哩哔哩_bilibili

        我给他放到码云上了,录视频的时候开源协议没选,加上git命令太久没用生疏了,commit没推上去,现在好啦。等他初步可以用的时候我在开源。

代码风格约束

今天没想好,后面会逐步更新,暂时只有三点要求

1.注释必须使用/**/,且注释中不能包含注释

2.所有的缩进必须使用空格

3.每个文件要按照样例文件创建

4.==判断时常量在左变量在右

5.函数明变量名等长度不可以超过32个

6.宏定义必须大写

7.宏定义要用()

8.复杂宏定义需要使用do{}while(0)

        为什么要这样要求呢,首先注释用//的话,如果你的编辑器宽度不够,换个环境你的一行长注释可能会变成两行,这样编译时会报错的。

        缩进用空格则是因为tab不是在所有环境中都是四个空格的,会导致代码外观上很奇怪,另外有些文本工具可能没有tab解析。咱们为了体现专业性,所有的缩进都必须使用空格。

        文件样理后面解释

        我们有时在做等于判断时可能会漏下一个等号导致变成赋值操作,这样很不好。为了防止这种问题出现,可以把常量写左面。这样漏写时一编译就会检查出来。

        函数名变量名不超过32个其实也是为了优化效率,因为这个名字在程序执行阶段是会被用到的。名字过长就会影响效率,严重还会导致程序执行不了,超过硬件能访问的宽度了他可能会没法成功匹配正确的函数和变量。当然这个不是一一对应的,不是32个字符就对应32位。不是这样的。但是也右一定关系,所以最好别太长了。

        宏定义大写就是一个规范,这样你用的时候一下就知道他是个宏。

        宏定义必须用括号这个就比较有意思了举个例子

#define A(a) a*aint b = A(1+1);

当你没用括号时

b的值是1+1*1+1=3

但是其实你真正想的是4对吧

那就要这样

#define A(a) (a)*(a)

但是这样还是有问题,比如我要拿这个去计算时

#define a   1 + 1int b = a;

会只拿一个1,所以也要加括号

#define a   (1 + 1)int b = a;

当然我只是举个例子。正常不会这么简单

还有就是这种

#define INIT (0)
#define RES  (1)

        经常会看到很多寄存器会这样写,这个我不清楚为什么可能是为了统一代码风格,要是有知道的兄弟欢迎评论区来说说哈。

        然后就是do while这种就是因为有些宏要定义的比较复杂。

#include <stdio.h>  #define INT_TO_CHARS(n)    do{ \((n) >> 24 & 0xFF);\((n) >> 16 & 0xFF);\((n) >> 8 & 0xFF);\((n) & 0xFF);\
}while(0);int main() {  int num = 12345;  char chars[4];  // 使用宏将整型数拆分为四个char  chars[0] = INT_TO_CHARS(num)[0];  chars[1] = INT_TO_CHARS(num)[1];  chars[2] = INT_TO_CHARS(num)[2];  chars[3] = INT_TO_CHARS(num)[3];  printf("Chars: %c%c%c%c\n", chars[0], chars[1], chars[2], chars[3]);  return 0;  
}

为了保证定义的宏后面内容是个整体所以还要用\保证他们是一行的。

代码结构和模板

        暂时就是这样一个简单结构后面在继续丰富,我目前分三层,底层hardware,应用层APP和显示层show。

/*FILENAME:    main.c*DESC    :    program entry*AUTHOR  :    tianyu.xin**/

文件头每个文件都要有,这个后面继续补充描述项

/*FILENAME:    template.c*DESC    :    template Head file*AUTHOR  :    tianyu.xin**//* 62* */
/**************************************************************
***************************EXTERN******************************
**************************************************************//**************************************************************
***************************LOCAL******************************
**************************************************************/
#ifndef __TEMPLATE_H__
#define __TEMPLATE_H__
/*FILENAME:    template.c*DESC    :    template Head file*AUTHOR  :    tianyu.xin**//**************************************************************
***************************DEFINE******************************
**************************************************************//**************************************************************
***************************EXTERN******************************
**************************************************************//**************************************************************
***************************LOCAL******************************
**************************************************************/#endif /*template.h*/

local区存放本地函数,extern区存放针对本文件以外的对外接口

DEFINE是宏定义的区域

目前build还有很多问题,先用make后面用python做build过程。

目前python脚本支持清除工作。

import subprocess  
import sys  
import os  
import glob# 获取当前目录的绝对路径  
current_directory = os.getcwd()
output = current_directory+"/OUTPUT/"# 打印当前目录的路径  
print("当前目录的路径是:", current_directory)def compile_makefile():  """编译Makefile"""  subprocess.run(["make"])  # def clean():  
#     """清除Makefile编译的产物"""  
#     subprocess.run(["rm", output+"*"], shell=True)def clean():  """清除Makefile编译的产物"""  files_to_delete = glob.glob(output + "*")for file in files_to_delete:os.remove(file)if __name__ == "__main__":  if len(sys.argv) < 2:  pass#print("请输入命令参数:make 或 clean")elif sys.argv[1] == "make":  compile_makefile()  elif sys.argv[1] == "clean":  clean()  else:  print("无效的命令参数")

这篇关于hardware simulation——框架搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/604741

相关文章

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

使用DeepSeek搭建个人知识库(在笔记本电脑上)

《使用DeepSeek搭建个人知识库(在笔记本电脑上)》本文介绍了如何在笔记本电脑上使用DeepSeek和开源工具搭建个人知识库,通过安装DeepSeek和RAGFlow,并使用CherryStudi... 目录部署环境软件清单安装DeepSeek安装Cherry Studio安装RAGFlow设置知识库总

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea