- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个微 Controller ,它必须从 PC 串行端口(115200 波特)下载一个大文件,然后通过 SPI(~2 MHz)将其写入串行闪存。闪存写入必须在 256 字节 block 中,前面有写入命令和页地址。系统上可用的总 RAM 为 1 kB,堆栈大小为 80 字节。
目前的工作方式是从 UART 填充一个 256 字节缓冲区,然后在闪存写入繁忙写入时,ping-ponging 到另一个 256 字节缓冲区,该缓冲区由 RX 缓冲区就绪信号上的中断填充。重复缓冲区交换,直到操作完成。
我更愿意为在单独的循环缓冲区上运行的 SPI 和 UART 端口设置 TX/RX 中断处理程序。因此,无需轮询新字节并等待操作完成,我可以简单地填充 TX 缓冲区并启用中断或检查缓冲区中的传入数据。这将为实际工作提供更多的时钟周期,而不是等待外围设备。
在使用 128 字节循环缓冲区实现 IRQ 后,我轮询 UART RX 缓冲区以获取数据并立即将其放入 SPI TX 缓冲区以进行文件传输。我在使用这种方法时遇到的问题是,我没有足够的 RAM 用于缓冲区,而且 PC 接收缓冲区的填充速度比我将数据传输到闪存传输缓冲区的速度更快。显然,传输速度不是问题(115.2 kHz 输入和 2 MHz 输出),但在传输每个 256 字节页面后有一个写周期等待。
似乎频繁的 SPI 中断阻塞了一些 UART 中断并导致字节丢失。我选择的解决方案是为 UART 接收中断使用一个环形缓冲区,并将数据送入一个 256 字节的页面缓冲区,该缓冲区通过轮询字节传输和写入完成被发送到串行闪存。 128 环形缓冲区足够大,可以防止 SPI 写入期间发生溢出。
最佳答案
应用程序的 UART 和 PC 端是否支持 RS-232 握手(流量控制)?如果是这样,当您的接收缓冲区接近满时,让 ISR 丢弃 CTS 线 - 如果 PC 端配置为尊重硬件流控制,它应该在看到这种情况时停止发送。耗尽(或几乎耗尽)接收缓冲区后,再次断言 CTS,PC 应再次开始发送。
请注意,这会使嵌入式设备上的软件变得相当复杂 - 您是否愿意做出这种权衡必须由您和您的经理及团队进行分析。
关于c - 您如何在内存非常受限的嵌入式系统上处理大量数据传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/359745/
我有一个数据类型是 Monoid 的实例所以我可以得到很好的值(value)观组合: data R a = R String (Maybe (String → a)) instance Monoid
目标:我需要在权限非常有限的 AppDomain 中运行一些代码 - 它应该无法访问任何花哨或不安全的东西,除了少数我在别处定义的辅助方法。 我所做的:我正在创建一个具有所需基本权限的沙箱 AppDo
在我的 VPS 中,我不知道为什么,但是当我对另一个用户执行 su 时,我得到的是: root@deb64:~# su john $ 带选项卡的自动完成不起作用,甚至是命令源。示例: root@deb
我正在寻找一种方法,将二进制代码标记为“受限”,而代码是用swift编写的。 我特别要说的是,将这些标志设置到链接器以防止动态库加载: -Wl,-sectcreate,__RESTRICT,__res
这个问题在这里已经有了答案: Access restriction on class due to restriction on required library rt.jar? (15 个答案)
我正在寻找一个基于Web的JavaScript textarea编辑器,该编辑器支持诸如可选字体,文本颜色,段落对齐等标准功能。但是,有一个相当大的约束:格式应始终应用于所有文本,而不是部分文本。文本
我有以下查询: SELECT pro.* FROM tb_AutProposta pro, tb_AutParcelamento par WHERE pro.id = par.id 但是,想要将
我的问题实际上是一个逻辑问题,任务是将列表截断到 Racket 中的给定长度。也就是说,给定一个列表 (A B C),给定长度为 2,我想要一个新列表 (A B)。限制是我们有可用功能的限制列表,我将
我试图将 jQuery UI DatePicker 限制为仅当前年份,到目前为止它在 This Demo 处工作正常。 我使用以下代码来完成这项工作 $("#datepicker").datepick
我在 minikube 中启用了 podsecuritypolicy。默认情况下,它创建了两个 psp - 特权和受限。 NAME PRIV CAPS SELINUX
我使用 Google Cloud Endpoints 定义了一个简单的 API: @Api(name = "realestate", version = "v1") public class Real
我在Tableau中设计可视化,我的数据在Hive/hadoop中,数据量很大, 当我尝试设计可视化时,查询运行非常非常慢,因为每次它尝试从 hadoop 中提取数据。 所以对于任何可视化,简单的拖放
我已经在这个问题上停留了一段时间。我正在尝试访问我使用 HttpClient 和 Tomcat 7 实现的 ContainerServlet。我不断收到错误消息“Restricted(Containe
由于使用了太多的 Websphere Message Broker 实例或类似的东西,我们刚刚用完了 Linux 机器上的信号量。 我和一位同事想知道为什么这甚至是有限的 - 这只是一点内存,对吧?
我正在尝试复制 boost::variant二维矢量转化为array .使用指令 copy(vectorName.begin(), extentName); .首先我得到错误,因为矢量类型是 vari
我的数据库非常受 cpu 限制,我找不到问题的根本原因。我目前有两个应用程序服务器,每个服务器都有一个 Rails api,通过 ruby-pg gem 连接到 PostgreSQL。两个应用程序
我已经开始学习多核编程和开发并行算法。这可以通过在 Java 中使用多线程轻松完成。因此,我创建了两个包含 10 行内容的文本文件,如下所示: This is the first line in fi
Jinja 的 sandbox Zope 2 RestrictedPython 似乎解决了类似的问题。有没有办法对它们进行分层,即在 Jinja 环境中使用 RestrictedPython 策略?用
我在 Azure VNet 上有一个 HDInsight Hadoop 群集(Linux,单独部署)(使用 NSG 限制客户端 IP)。 Azure SQL 防火墙有一个名为“允许访问 Azure 服
这就是我想要做的:我想使用“_”函数以 gettext 兼容的方式为我的 zmi python 脚本启用 i18n 支持。 这是我到目前为止所做的。在我的 Zope 产品的模块中,我运行: impor
我是一名优秀的程序员,十分优秀!