上位机图像处理和嵌入式模块部署(树莓派4b实现固件主流程)

news2024/12/24 3:54:05

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        软件开发一般有软件需求、架构设计和详细设计、软件测试这四个部分。软件需求和软件测试都比较好理解,前者是说要实现哪些功能,后者是说做好的功能怎么测试。而架构设计和详细设计很多同学不太清楚,这两者的区别是什么。所谓的架构设计,其实就是业务的主流程是什么,一般来说,软件开发好之后,会做成一个通用产品,然后根据客户的需求做定制化开发。这是一般的做法,不然针对每个客户都要做一次定制开发,成本是受不了的。

        而软件架构设计,就是摒弃不同客户之间的差异,提取公共的业务开发流程,这样的设计就是架构设计。它不限于用什么os、什么db,或者说用什么框架,它聚焦于业务的抽象和提炼。比如插件式开发,mvc开发,client-server开发,分布式开发,单机版运行再或者是抽象出来的业务逻辑,这些都属于架构设计的部分。架构设计聚焦于数据在模块之间的处理逻辑,而不是模块内的实现细节。

        而详细设计,则是将软件架构设计中的一个一个模块进行细化处理,比如什么的数据结构、怎么并发、怎么实现缓存、怎么做好增删改查等等,这些部分都是详细设计的范畴。一开始写软件的时候,很容易把详细设计和架构设计等同起来,等到项目做的多了,就会从一类项目中提取出公共的框架,自然而然就有了架构设计的理念和想法。

1、架构设计的文档

        很多同学喜欢直接写代码,不考虑架构设计文档,这是不好的做法。一件事情如果没有考虑清楚,或者考虑的不是很完善,很容易推导重来,这样开发的效率反而是变得很慢。所以说,我们在开发软件的时候一定要做好文档的编写。

2、写一部分代码,然后开始做架构设计文档

        这部分代码可以很少,比如只是一个抽象流程,大约200-300行的范围。里面的数据结构完全可以不要,只要保证整体编过就可以了。代码的好处就是比较直观和方便,让我们知道当前的架构还有什么不足,能不能在一定程度上满足未来需求的拓展和补充。

3、代码和架构文档交叉完成

        编写代码的时候,可以同时写架构文档。觉得文档不对的地方,可以同步更改下代码。或者说代码不好实现的部分,就可以同时修改下文档,这都是可以的。个人非常不建议天马行空地去做文档,只有文档和代码bind在一起,才能去验证自己想法的合理性。一般来说,与架构匹配的代码可以很短,几十、几百行的代码就可以说明问题。

4、一个固件主流程实现的范例

        我们用树莓派4b实现一个图像处理的主流程。第一步,可以考虑下,整个软件怎么跑起来,比如说加载ini文件、启动xmlrpc server、准备method绑定等等;第二步,考虑客户可能会有哪些功能,这些功能怎么放到整体的代码逻辑当中去;第三步,针对前面讲到的插件和调度引擎,这部分究竟该怎么加载、怎么实现。紧紧围绕这三点,我们就可以写出一个简单的框架伪代码。这个伪代码是完全可以运行的,只不过没有具体的数据而已。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <iostream>
using namespace std;

// class definition
class Plugin
{
public:
	Plugin() {}
	~Plugin() {}
	bool execute(string param) { return true;}
};

// command from client
class ReceiveFile
{
public:
	ReceiveFile() {}
	~ReceiveFile() {}
	void exec() {}
};

class UpdateParam
{
public:
	UpdateParam() {}
	~UpdateParam() {}
	void exec() {}
};

static void startNewWorkThread();
class RunWorkThread
{
public:
	RunWorkThread() {}
	~RunWorkThread() {}
	void exec() { startNewWorkThread(); }
};

// function declaration
void initLog() {}
void loadIniFile() {}
void launchXmlRpcServer() {}
void runXmlRpcServer() {}
void shutdownSystem() {}
void checkWorkParam() {}
void loadRelavantPlugins() {}
void releaseRelevantPlugins() {}
Plugin pickPlugin(int id) { return Plugin(); }
int getNextPluginId(int id) { return 0; }

static bool runSingleProcedure()
{
	Plugin plugin;
	string pluginParam;
	bool result;
	int id = 0;

	while (1)
	{
		plugin = pickPlugin(id);
		result = plugin.execute(pluginParam);
		if (!result)
		{
			break;
		}

		id = getNextPluginId(id);
	}

	return result;
}


static void startWorkEngine(string workParam)
{
	bool runOnce = true;
	checkWorkParam();
	loadRelavantPlugins();

	// check if run once or loop run
	if (runOnce)
	{
		runSingleProcedure();
	}
	else
	{
		while (true == runSingleProcedure())
		{
			sleep(0.05);
		}
	}

	releaseRelevantPlugins();
}

static void startNewWorkThread()
{
	string workParam;
	startWorkEngine(workParam);
}

// main file starts here
int main(int argc, char* argv[])
{
	initLog();

	loadIniFile();

	launchXmlRpcServer();

	runXmlRpcServer();

	shutdownSystem();

	return 0;
}

5、调试和验证

        有些时候,嵌入式调试并不方便,可能windows上面的vs调试更加方便一点。以上面的代码为例,其实我们只需要根据平台判断当前是哪个,选择不同的头文件和函数即可,这样一份代码就可以在两个平台上都可以运行了。

        比如说,假设是windows平台,添加的内容如下,

#include <Windows.h>

Sleep(50);

        反之,如果是linux平台,则添加的内容如下,

#include <unistd.h>

sleep(0.05);

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

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

相关文章

【SpringBoot+VUE+ELEMENT 】前后端分离的管理系统的实现——基础功能(记录向)

一个前后端分离的实现。后端使用SpringBoot&#xff0c;前端使用Vue&#xff0c;后端标准的四层结构&#xff0c;前端是用的Element。 一、环境准备 1.安装node.js Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 成功后cmd中运行 node -v npm -v 出现 对应的版本…

活动 | 华院计算与数学家一起走进世界轨道交通之都-中国株洲

4月17日&#xff0c;由株洲市人民政府主办、株洲高新区管委会承办&#xff0c;华院计算技术&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称“华院计算”&#xff09;协办的“制造名城、院士同行&#xff0c;数学家走进株洲”活动在湖南株洲举行。 来自中国数学…

匿名函数与gorm中的Transaction事务方法

整理下go中的匿名函数&#xff0c;项目中很多地方都在用。 1、函数类型的变量 Go中&#xff0c;函数也是一种数据类型。定义一个函数&#xff0c;把这个函数赋值给一个变量&#xff0c;这个变量就是函数类型的变量&#xff0c;用这个变量等价于直接调函数&#xff1a; packa…

算法刷题记录2

4.图 4.1.被围绕的区域 思路&#xff1a;图中只有与边界上联通的O才不算是被X包围。因此本题就是从边界上的O开始递归&#xff0c;找与边界O联通的O&#xff0c;并标记为#&#xff08;代表已遍历&#xff09;&#xff0c;最后图中剩下的O就是&#xff1a;被X包围的O。图中所有…

使用LVGL提升交互效率:基于启明智显Model3A方案的7寸智能屏用户界面(UI)设计介绍

项目概述&#xff1a; 【启明智显】&#xff0c;作为一家专注于HMI和AIoT解决方案的公司&#xff0c;我们致力于为用户提供创新、可靠且高效的产品和解决方案。近日我们推出了高性能及高性价比的HMI芯片——Model3A。芯片搭载了强大的2D图形加速引擎&#xff0c;能够提供高达7…

RNN知识体系构筑:详尽阐述其理论基础、技术架构及其在处理序列数据挑战中的创新应用

一、为什么需要RNN 尽管神经网络被视为一种强大且理论上能够近似任何连续函数的模型&#xff0c;尤其当训练数据充足时&#xff0c;它们能够在输入空间中的某个点( x )映射到输出空间的特定值( y )&#xff0c;然而&#xff0c;这并不能完全解释为何在众多应用场景中&#xff…

基于Spring Boot的新生宿舍管理系统设计与开发

基于Spring Boot的新生宿舍管理系统设计与开发 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 报修处理管理界面图&#xff0c;在报修处理管理页面…

QA测试开发工程师面试题满分问答16: 微信输入框如何设计测试用例?

可以涵盖基础功能、用户交互、编辑撤回、权限相关、网络信号、异常、并发性能和安全性等方面的测试用例&#xff1a; 基础功能&#xff1a; 验证输入框是否能够接收用户输入&#xff0c;并显示输入的文字。检查输入框是否支持常见的字符输入&#xff0c;如字母、数字、标点符号…

Unity Shader 流光 边缘光

前言 Unity2021.3.23 一、实现原理 Time控制UV的变化,再采样一张流光贴图.即可实现流光效果。 二、效果及源码展示 1.流光效果 效果描述: 1.边缘光(菲尼尔), 2.从上到下扫描光. 效果图如下: 代码如下&#xff1a; Shader "Unlit/ScanCode" {Properties{_MainTe…

【数据结构】树与二叉树、树与森林部分习题与算法设计例题

目录 【数据结构】树与二叉树部分习题与算法设计例题一、单选题二、算法设计题判断二叉树是否为完全二叉树求二叉树的最小深度 以及 二叉树树高 树与二叉树知识点文章: 【数据结构】树与二叉树&#xff08;递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方…

必看——通配符SSL证书在线免费申请方法!

申请通配符SSL证书&#xff0c;就相当于给你的网站及所有子域名都戴上同一顶加密“帽子”&#xff0c;保护它们的安全通信。以下是三步搞定的方法&#xff1a; 第一步&#xff1a;找权威机构 就像你要找个官方认证的地方办证明一样&#xff0c;先选一家靠谱的证书颁发机构&…

软考中级网络工程师-2024上岸宝典

1.软考是什么 简单说就是计算机技术 相关的国家级证书考试&#xff0c;想听专业点给大家截一张官网的图&#xff0c;不想听废话直接往下。 同为国家级证书的&#xff1a;注册会计师、法律职业资格证、一级建筑师&#xff0c;证书的价值是比较高的。 很多人都是在求职前或者大…

产废端实时音视频监控系统在运输车辆驾驶室中的应用

实时音视频监控系统可通过在运输车辆驾驶室安装音视频摄录设备&#xff0c;实现将运输车辆内部及周围环境音视频数据通过移动网络实时回传指挥中心的功能。 前端摄录设备主要负责采集车内外的视音频信息&#xff0c;为了保障车辆及运输人员 的安全&#xff0c;应合理选择摄录设…

探索半导体测试领域:哲讯TCC智能化管理系统的应用与优势

在半导体行业中&#xff0c;封装和测试环节是至关重要的一环。半导体封装测试是指将通过测试的晶圆按照产品型号及功能需求加工得到独立芯片的过程。半导体封测包括封装和测试两个环节&#xff0c;封装是保护芯片免受物理、化学等环境因素造成的损伤&#xff0c;增强芯片的散热…

node.js-模块化

定义&#xff1a;CommonJS模块是为Node.js打包Javascript代码的原始方式。Node.js还支持浏览器和其他Javascript运行时使用的ECMAScript模块标准。 在Node.js中&#xff0c;每个文件都被视为一个单独的模块。 概念&#xff1a;项目是由很多个模块文件组成的 好处&#xff1a…

一文读懂电阻并联电路和串联电路的特性

电阻并联电路是最基本的并联电路&#xff0c;所有的电路都可以转化为电阻串联电路和电阻并联电路来了解其工作原理。并联电路和串联电路具有完全不同的特性。它们是完全不同的电路&#xff0c;不能相互等效&#xff08;电阻并联电路图&#xff09;。 串联电路 特点与特性&…

教你三招,玩转AI通用大模型ChatGPT

工欲善其事必先利其器&#xff0c;想要高效的用好ChatGPT&#xff0c;首先&#xff0c;让我们从如何与它进行有效的对话开始。要知道&#xff0c;ChatGPT并非简单的问答机器&#xff0c;而是一个可以通过交互学习和适应的智能体。那么&#xff0c;如何让ChatGPT来更好地理解我们…

用云手机运营TikTok有什么好处?

在数字化浪潮的推动下&#xff0c;社交媒体平台正重塑商业推广与品牌建设的面貌。TikTok&#xff0c;这款全球热门的短视频应用&#xff0c;已经吸引了亿万用户的瞩目。对于出海电商和品牌推广而言&#xff0c;借助云手机运营TikTok&#xff0c;能够解锁更多潜在可能&#xff0…

短视频素材哪个网站好?8个视频素材下载免费网站

在视频制作的宏大舞台上&#xff0c;寻找恰到好处的素材是每位创作者的日常挑战。高清、无水印的视频素材不仅能够让你的作品焕发光彩&#xff0c;还能在讲述故事时增添无限动力。除了蛙学府&#xff0c;这里汇集了世界各地的视频素材网站&#xff0c;每个都带有独特的魅力&…

数据结构(七)——散列表

7.5.1 散列表的基本概念 散列表&#xff08;哈希表&#xff0c;Hash Table)︰是一种数据结构。特点是∶可以根据数据元素的关键字计算出它在散列表中的存储地址 散列函数&#xff08;哈希函数)︰AddrH(key)建立了“关键字”→“存储地址”的映射关系 冲突&#xff08;碰撞)︰在…