我正在尝试了解DMA传输速率,我不明白这个问题.我有答案,但不知道如何到达那里.
该问题涉及使用DMA来处理到达输入接口的数据的存储器中的输入和存储,使用该机制可实现的可实现的数据速率,以及用于特定数据速率的总线带宽(容量).您将获得执行每次DMA传输所执行的时钟周期的详细信息,以及获取和释放总线的时钟周期.下面给出:DMA设备在输入接口和存储器之间传输单个数据项所需的时钟周期数,获取和释放系统总线的时钟周期数,每个数据的大小(以位为单位)项目和时钟频率.
每次数据传输的时钟周期数8
获取和释放总线的时钟周期数4
每个数据项的位数= 8
时钟频率= 20MHz
A)以Kbits /秒为单位的最大可实现数据速率是多少?
B)如果数据速率为267Kbits/sec,DMA设备使用了多少百分比的总线时钟?
答案
A)20000.0
B)2.0
提前致谢.
在https://www.kernel.org/doc/Documentation/DMA-API.txt上的文字后面几个内联问题
Part Ia - Using large dma-coherent buffers
------------------------------------------
void *
dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flag)
Consistent memory is memory for which a write by either the device or
the processor can immediately be read by the processor or device
without having to worry about caching effects. (You may however need
to make sure to flush the processor's write buffers before telling
devices to read that memory.)
Run Code Online (Sandbox Code Playgroud)
Q1.假设分配的区域是可缓存的是否安全?作为需要冲洗的最后一行状态
Q1A.此API是否从较低的16MB分配内存,这被认为是DMA安全的.
dma_addr_t
dma_map_single(struct device *dev, void …Run Code Online (Sandbox Code Playgroud) 我想编写一个使用DMA的函数(changeSize),我可以选择将它(数组)的大小更改为我想要的大小,其中oldEls是原始大小,newEls是新大小.如果newEls大于oldEls,我只会在结尾添加零,如果它小于oldEls,我只会截断."ptr"参数需要指向新数组.据我所知,这与C realloc()函数类似.
使用下面的代码,我输出以下内容:0,0,3,6,0,0,0,0,其中正确的输出应为4,2,3,6,0,0,0,0.我也意识到我的show函数可能不是输出新数组的最佳函数,因为我必须明确说明数组元素的大小.
提前致谢.
#include <iostream>
#include <cstdlib>
using namespace std;
void show( const int a[], unsigned elements );
int * copy( const int a[], unsigned els );
void changeSize( int * & ptr, int newEls, int oldEls );
void die(const string & msg);
int main()
{
int arr[4] = {4, 2, 3, 6};
show(arr, 4);
int * newArr = copy(arr, 4);
cout << endl << endl;
changeSize(newArr, 8, 4);
show(newArr, 8);
}
void show( const int a[], unsigned elements …Run Code Online (Sandbox Code Playgroud) 嘿,我正试图解决这个学校的运动..
编写一个程序,继续读取字符串并连接它们(将它们添加到单个字符串).串联应该在一个函数中发生,如果成功则返回1,如果失败则返回0.对于内存分配,只使用realloc!
调试程序时我没有收到任何错误,但是当我尝试运行程序时,在插入字符串之后,唯一出现的是"Segmentation Fault",它会是什么?这是代码:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int cat(char **, char *);
int main(void)
{
char string[51];
char *output=NULL;
char choice;
do
{
printf("Please enter a string [<50 chars]: ");
fgets(string,50,stdin);
if(string[strlen(string)-1]=='\n') /* if newline was read as well */
string[strlen(string)-1]=0; /* discard it */
if(cat(&output,string))
printf("\n\nThe string now contains:\n%s\n",output);
else
{
printf("error: memory (re-)allocation failed!\n\n");
return 1; /* exit with error */
}
printf("Continue? (y/n) - ");
fgets(string,3,stdin); /* read input from keyboard - leave a safety buffer to …Run Code Online (Sandbox Code Playgroud) 我正在使用 STM32F3 微控制器和 HAL 库。对于许多外设(例如ADC、SPI、I2C),HAL 库提供了3 种读/写数据的方式:轮询模式、中断模式和DMA 模式。我知道我不想要轮询模式,因为它会阻塞。但是,我不确定如何在中断模式和 DMA 模式之间进行选择。有一般经验法则吗?我觉得DMA模式应该总是更好,因为它可以在没有CPU干预的情况下将值写入内存?
DMA 芯片对 5 字节这样的小数据包有效吗?
我正在使用 STM32 开发一个嵌入式项目,我使用 DMA 接收 3 字节数据包,但是当使用 DMA 传输 5 字节数据包时,我没有立即在接收端获取数据包,但是当使用正常传输时,我更快地获取数据包。
那么我们可以说DMA对小数据包无效吗?
我正在写一个PCI设备驱动程序,我需要为DMA分配一些内存,我正在使用这个函数:
void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);
Run Code Online (Sandbox Code Playgroud)
我将dma_handle传递给设备.
这个函数的返回值是我可以在内核中使用的虚拟地址,事情是我不想为每个内存分配保存这个地址.
有没有办法将物理地址dma_handle转换为我可以在内核中使用的地址?像这些函数/宏之一的东西:
virt_to_page(kaddr)
page_to_pfn(page)
Run Code Online (Sandbox Code Playgroud)
是否有phy_to_kvirt宏/函数或任何其他方式将物理地址转换为内核虚拟地址?
谢谢