问题标签 [soc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 结合ARM SoC的两个联合结构
我正在尝试将 ARM SoC 的 GPIO 端口的两个 typedef 联合合并为一个,并将地址指针合并为一个。目前,我有一些看起来像这样的东西:
.h 文件:
.c 文件:
我可以使用它来控制 ARM SoC 的 GPIO 端口。即我可以通过更改 GPIO00portbits.GPIO00x 来控制 GPIO00 的单个引脚。它对 GPIO01 的工作原理相同。
实际上,GPIO00和GPIO01实际上是一个叫GPIO0的端口,其中GPIO00是pin 0-17,GPIO01是pin 18-35,所以我也想将GPIO00和GPIO01合并为一个结构,可以通过更改GPIO0portbits.GPIO0x来控制.
所以我想要这样的东西:
我怎样才能做到这一点?
先感谢您。
arm - 无法读写间隔定时器寄存器 DE1-SoC HPS
我有一个 DE1-SoC (Cyclone V) 板,我试图让定时器中断在 HPS 上工作。我在 Intel FPGA University Program 中找到了一个名为“interrupt_example”的示例,当我在 Intel FPGA Universioty Program 上运行它时,它运行良好。
现在我想把这个项目转移到 ARM DS,但我无法让它工作,因为每次我试图写入地址 0xFF202000 的间隔计时器时,调试器都不会继续。当我尝试在 ARM DS 中查看 0xFF202000 的内存时,我也看不到任何东西。
我正在使用相同的编译器(GCC C 4.7.3 arm-altera-eabi)并且我尝试使用相同的编译器参数:
英特尔 FPGA 监控程序
ARM DS
我也使用相同的链接器参数:
英特尔 FPGA 监控程序
ARM DS
我也尝试使用相同的预加载器,但是当我编写调试脚本时这不起作用。我不确定这是否是问题所在。如果这确实是问题所在,如果有人可以帮助我编写另一个调试脚本,我将不胜感激,因为当我尝试使用 u-boot-spl.de1-soc.srec 作为预加载器时,ARM DS 会给我带来问题。
Intel FPGA Monitor Program 中的预加载器信息
ARM DS 中的调试脚本
正在编写 0xFF202000 的代码的反汇编看起来也相同:
英特尔 FPGA 监控程序
拆解图 Intel FPGA Monitor Program
ARM DS
我尝试了我现在能想到的一切。我真的希望有人能帮助我。先感谢您。
编辑:同时,我发现当程序尝试写入 0xFF202000 时,它在汇编中进入了一个无限循环。我对组装不是很熟悉,所以我不确定为什么会发生这种情况。 无限循环组件 0xFF202000
.net-core - 尝试在 Orange Pi Zero 上使用 .Net Core 5 检测 GPIO 引脚的上升和下降。引脚上升有时仅与引脚下降一起检测
我正在尝试检测 Orange Pi Zero 的 GPIO 引脚的变化(基本上与 Raspberry Pi 相同)。它正在运行 Armbian Buster(即 Debian 10)
我创建了一个简单的 .Net Core 5 控制台应用程序,使用 .Net 的内置System.Device.Gpio库来检测这一点:
然后我将一个按钮连接到 GPIO 引脚 10(Orange Pi Zero 上的物理引脚 26)并运行程序。当我按下按钮时,大约有一半的时间它会立即检测到这一点。当我松开按钮时,它总是会立即检测到这一点。但大约有一半的时间,它没有检测到按钮的按下,只有当我释放按钮时,onSignalPinRiseEvent 才会触发(连同 onSignalPinFallEvent 事件)
换句话说,大约有一半的时间,按钮的按下(即 GPIO 引脚的上升)仅与按钮的释放(即 GPIO 引脚的下降)一起被检测到,而不是在按下按钮时立即被检测到。按钮被按下。
奇怪的是我包含了一个时间戳,而且大多数时候,即使我在松开按钮之前按住按钮 3 秒,上升和下降的时间戳是相同的(但并非总是 - 有一些极少数情况下,即使上升和下降事件仅在我释放按钮时触发,显示的时间戳也相隔 3 秒)。
然后我尝试只为上升和下降检测注册一个事件处理程序,而不是两个单独的处理程序:
但这并没有什么不同。
这是一个示例输出 - 我按下按钮大约 3 秒钟,然后释放大约 3 秒钟:
在上面,具有相同时间戳的对是有问题的对。那些是当我按下按钮时没有写入控制台的那些,然后,三秒钟后,当我释放按钮时,它同时写了两行(上升和下降)具有相同的时间戳。
有任何想法吗?
arrays - Free() 一个安全复制的字符串数组崩溃?
我正在尝试在 SoC 平台(裸机应用程序)上运行以下 C 程序。
我有几个字符串数组,定义为
我知道这可以作为 char 数组的数组工作:*init_array[0] 返回“f”字符,init_array[0] 返回“foo”的第一个地址,&init_array[0] 返回“foo”的第一个地址所在的地址"被保存。我使用的程序基于该定义,因此我不应该更改它。
这些数组正在进入一个循环,其中可能会或可能不会发生外部更改。在接下来的迭代中,数组不得携带“错误”。
我得到的解决方案之一是保留这些数组的两个副本,一个是我要使用的,一个是初始化它们的。
显然,这必须是“安全复制”的,以避免使用相同的地址。我已经实现了这一点,代码如下:
在这里使用 malloc() (如果可能的话,我宁愿避免)要求在每次迭代结束时使用 free() :
并且它完美地工作,对于少量的迭代。然后,程序崩溃了,我必须重置我正在使用的平台。正如我上面提到的,我知道它在最后一个循环的某个地方崩溃了。我也读过:
malloc()、calloc()、realloc() 或 free() 中的崩溃几乎总是与堆损坏有关,例如溢出分配的块或释放同一指针两次。
我真的无法弄清楚我做错了什么。这是一个堆损坏问题,我该如何处理或者我从一开始就错了?
fpga - 异步 FIFO 深度计算
我需要计算填充异步 FIFO 需要多长时间。例如:假设模块'A'想要向模块'B'发送一些数据。模块A的频率为80MHz。B模块的频率为50MHz。突发长度为 120。读取和写入都没有空闲周期。FIFO 深度为 20。填充 FIFO 需要多长时间?
我知道FIFO的最小深度应该是45。'写入一个数据项所需的时间=1/80MHz=12.5ns 写入突发中所有数据所需的时间=120*12.5ns=1500ns。读取一个数据项所需的时间=1/50MHz=20ns。在 1500ns=1500/20=75 的时长内可以读取的数据项数 FIFO 中要存储的剩余字节数=120-75=45。但是如果 FIFO 的深度是 20。我如何计算填充 FIFO 的时间?
问题2:我阅读了一些材料。如果是连续写入,FIFO的深度应该是无限的。连续写入和突发写入有什么区别?为什么有限深度的 FIFO 足以让突发写入?
microcontroller - 裸机、RTOS 和 SoC 有什么区别?
最近刚开始使用 PIC 微控制器进行嵌入式编程,我试图了解裸机、RTOS 和 SoC 之间的区别。
在线搜索揭示了相互矛盾的定义和含义。
例如,Semiengineering声明“RTOS 是在裸机上编写的代码”,而arduino.cc声明“如果您在不使用任何 [RT]OS 的情况下对控制器进行编程,那么它就是一种裸机方法”。
这意味着在裸机上编写的一些代码可以被认为是 RTOS,而其他代码可能不是。
因此,我的问题是什么时候可以将微控制器的嵌入式编程视为裸机和/或 RTOS 编程?如果有的话,SoC 在哪里适合所有这些?
任何人都可以提供的任何见解将不胜感激!
docker - 在 ARM 上构建和部署 GCC/AMD64 C++ 应用程序的替代方案?
我有一个不依赖 FPGA 的小型 C++ 程序,我想在 Xilinx ZCU-104 板上的 APU 上构建和运行它。我的 C++ 程序在 GCC/AMD64 上成功构建和测试,并且具有较小的依赖性。我只想在不同的板上进行一些没有硬件优化的分析。
我知道在 Zynq 板上构建和部署应用程序至少有两种途径:
- 使用 petalinux
- 使用泊坞窗
我不清楚的是,考虑到我之前(在 Intel 上)构建过定制 Linux 并且我使用过多个架构容器并了解其中的含义,这些路径中的任何一个是否更适合我的用例在短期内。
scp
具体来说,假设所有二进制依赖项都已由链接器在构建时解决,我不能只安装一个卷并从 SD 卡或一个在板上运行二进制文件以在现有系统中部署,这似乎很奇怪-时间。我是否必须在部署的二进制文件中包含 petalinux,还是只有更深层次的硬件(如 FPGA)才需要?
此外,除了 petalinux、docker 等,是否还有其他选项。我知道 Yocto,但我认为此时此用例不需要自定义 linux。
这不一定是生产部署路径,只是其他人进行 FPGA 优化的概念验证和决策点。
rules - 如何编写创建规则以匹配/检测文件中包含的字符串与包含大量此类文件的另一个目录的 Yara 脚本?
- 该恶意软件属于PE类型。使用此文件类型的魔术字节。
- 要创建包含大量字符串的规则,编写一个为您创建规则的脚本可能会很有用。
- 通过智能找到的字符串可能单独存在于其他文件中。为确保您与恶意软件匹配,可能需要使用所有这些恶意软件。
我想在这里,我们必须使用条件“所有这些”。但是我如何将文件中包含的字符串输入到我的.yara
文件中呢?
示例这是我的文件的文件路径,其中包含要比较的所有字符串 -->
问题 --> 编写一个 Yara 规则,能够检测目录中实际上是恶意软件的
/home/student/Desktop/suspicious
文件。
memory - 调试内核 ECC 清理。ARM v7 Cyclone V SOC
我是一名硬件工程师,使用 Altera intel 的 Cyclone V SX SOC FPGA 开发新硬件。
我刚刚验证了我的 DDR3-800 内存时序(是的,它是一个旧芯片)。
我试图通过将数据位短路到地来证明 ECC 内存正在工作,这是验证硬件和软件对位错误的处理的常见做法。
然而,当我将 D1 短接到地时,内核惊慌失措。
这是“decode_stacktrace.sh”解码输出的顶部
(注意:第一行来自我添加到 Altera_EDAC 驱动程序的 printk)
我通过查看 linux 内核源代码来跟踪这一点。这是我认为正在发生的事情:
- 我将 D1 短接到地。
- ECC 启动并修复该位,触发中断。
- 在这种情况下,我对 D1 信号的光刷会导致 226 个可纠正错误。
- Altera ECC 驱动程序处理中断,收集信息并将所述信息返回给 ECC 管理器。
- ECC 管理器尝试使用位于“edac.h”中的一些内联程序集来清理受影响的内存,如下所示:
- 此代码运行并在某些时候遇到非法虚拟地址并触发错误:“无法在虚拟地址 c06a3b9c 处理内核分页请求”
更新:我已经确定第一个地址导致了 oops,并且即使有很多错误,我捕获的示例的大小(在上面的那个之后)只有 8 个长。
这段代码太不合我意了。我希望有一些经验的人可以成为我的老师,并告诉我如何去做。
在这一点上,我唯一的选择是尝试查看来自硬件的物理地址是如何被内核重新映射到虚拟内存中的。我想这就是它出错的地方。
任何帮助将不胜感激。
arm - 如何写入 DE1-SOC 板 HPS 部分的 USB OTG 控制器寄存器?
目前我正在开发 DE1-SOC 板的 USB 端口。我试图了解 USB 2.0 是如何工作的,但是当谈到 DE1-SOC 板时,据我所知,SOC 系统的 HPS 部分上的控制器是内存映射的,以便我们控制它们的功能。
现在,我可以访问内存映射设备,例如 7 段显示器、按钮和滑动开关,但是我无法访问和写入 USB OTG 控制器的寄存器,因此我无法使用 USB 功能董事会。
这是我在这一点上所做的:
pinmux() :在 SOC 和 USB ULPI 设备的引脚之间建立连接。
config_usb() :配置 USB 控制器,尝试给 USB 端口上电。
在 config_usb() 中,我可以访问 SYSMGR 寄存器(系统管理器寄存器),但是我无法访问 USB 控制器寄存器,在这种情况下是 USB0_HPRT。
我努力的主要目的是将 USB 鼠标插入其中一个端口并将其显示在 VGA 屏幕上。(我也可以访问和控制 VGA 端口。)
在这一点上,我不知道我错过了什么,我有点迷失在文档中。在这里,我在终点寻求帮助。
提前致谢。