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

news/2024/5/4 3:34:55

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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 runif (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.mrgr.cn/p/33174243

相关文章

LD-Pruner、EdgeFusion(On-Device T2I)、FreeDiff、TextCenGen、MemLLM

本文首发于公众号&#xff1a;机器感知 https://mp.weixin.qq.com/s/KiyNfwYWU-wBiCO-hE9qkA 苏 The devil is in the object boundary: towards annotation-free instance segmentation using Foundation Models Foundation models, pre-trained on a large amount of data…

IIS 执行此操作时出错。 详细信息:web.config 错误,.net core项目

一、IIS 执行此操作时出错。 详细信息:web.config 错误,.net core项目运行报错 错误信息提示的很明确:IIS Web Core模块问题 二、解析: IIS下报错,但是直接启动exe文件可以正常运行。三、解决方案 先安装IIS,然后安装 Asp.net Core 运行时。更多: IIS10 隐藏 http server…

特性描述01、Segment Routing MPLS介绍

Segment Routing MPLS介绍 定义 段路由SR(Segment Routing)是基于源路由理念而设计的在网络上转发数据包的一种协议。Segment Routing MPLS是指基于MPLS转发平面的Segment Routing,下文简称为Segment Routing。Segment Routing将网络路径分成一个个段,并且为这些段和网络中…

C# 窗体应用程序 Chart控件显示实时曲线

IDE: VS2019 项目模板&#xff1a;C# windows 窗体应用(.NET Framework) 【参考】 B站上教程C#Chart控件画折线图的使用&#xff0c;关于Chart控件的属性&#xff0c;介绍得非常详细。B站上教程C#上位机Chart控件实时曲线终极讲解&#xff0c;对鼠标滚轮事件等&#xff0c;多…

用html画一个睡觉的熊动画

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>睡觉的熊动画</title><link rel"stylesheet" href"./style.css"> </head><body><div id"contain…

【重回王座】ChatGPT发布最新模型gpt-4-turbo-2024-04-09

今天&#xff0c;新版GPT-4 Turbo再次在大型模型排行榜上荣登榜首&#xff0c;成功超越了此前领先的Claude 3 Opus。另外&#xff0c;新模型在处理长达64k的上下文时&#xff0c;性能竟能够与旧版在处理26k上下文时的表现相当。 目前GPT-4 Turbo仅限于ChatGPT Plus的用户&…

Leetcode - 周赛393

目录 一&#xff0c;3114. 替换字符可以得到的最晚时间 二&#xff0c;3115. 素数的最大距离 三&#xff0c;3116. 单面值组合的第 K 小金额 四&#xff0c; 3117. 划分数组得到最小的值之和 一&#xff0c;3114. 替换字符可以得到的最晚时间 本题是一道模拟题&#xff0c;…

java spring boot 2 开发实战笔记

本案例是java sping boot 2.2.1 第一步搭建环境:安装依赖 由于我们公司项目是1.8 环境不能乱,我现在自己的电脑是1.8环境,所以本次整理的boot 代码 也只能用1.8 boot版本为:2.2.1,新建项目后,在xml 文件中复制上以下代码 xml配置,最精简运行起来的需要配置一个数据库…

【代码随想录】【动态规划】day51:● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费

股票含冷冻期 def maxProfit(self, prices):""":type prices: List[int]:rtype: int"""if len(prices)<1:return 0else:dp[[0]*2 for _ in range(len(prices))]dp[0][0]-prices[0]dp[0][1]0dp[1][0]max(dp[0][0],dp[0][1]-prices[1])dp[1][1]…

Github 2024-04-16Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1Vue项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

个人 Scrum Day 4

一、项目总结 昨天已完成的工作:食堂列表界面 今日计划完成工作:用户登录系统 工作中遇到的困难:使用新版微信小程序的api接口和设计登录弹窗。 二、代码签入 https://github.com/gdut-canteen/gdut-canteen/commit/79cb13c09bc60343e20561a989d3eaaf8dc7075f 三、运行部分截…

aaPanel面板和宝塔(BT)面板安装及命令

aaPanel面板和宝塔面板都是同一家公司在运营,只是aaPanel面板主要服务于海外客户,宝塔面板服务于本地客户。通常如果使用的是海外的服务器部署web环境,建议使用aaPanel面板。宝塔面板是一款基于 Web 的管理服务器的面板软件,它可以帮助用户方便地管理服务器的各种功能。面板…

租用境外服务器,越南服务器的优势有哪些

自从中国加入世界贸易组织之后&#xff0c;国内经济增加速度非常快&#xff0c;同时越来越多的人选择去东南亚国家发展&#xff0c;因为当地的中国人很多&#xff0c;所以中国企业在当地面临着更小的文化差异。东南亚地区也是最新的经济体&#xff0c;互联网正处于蓬勃发展的阶…

数据结构:线性表————单链表专题

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

vue和react通用后台管理系统权限控制方案

1. 介绍 在任何企业级应用中&#xff0c;尤其是后台管理系统&#xff0c;权限控制是一个至关重要的环节。它确保了系统资源的安全性&#xff0c;防止非法访问和操作&#xff0c;保障业务流程的正常进行。本文件将详细解析后台管理系统中的权限控制机制及其实施策略。 那么权限…

使用Docker部署开源建站工具—Halo,并实现个人博客公网访问

目录 推荐 前言 1. Docker部署Halo 1.1 检查Docker版本 如果未安装Docker可参考&#xff1a; 已安装Docker步骤&#xff1a; 1.2 在Docker中部署Halo 2. Linux安装Cpolar 2.1 打开服务器防火墙 2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址 4. 固定Halo公网…

如何使用XSSFWorkbook读取文本薄?

本篇文章暂不对XSSFWorkbook类进行解析和说明,仅附有实现代码。 如果文中阐述不全或不对的,多多交流。【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18146625 出自【进步*于辰的博客】1、文件兼容类型。 // 兼…