我被分配在RISC-V中进行一些图像处理图像,并制作了以下C原型
#include <stdio.h>
#include <stdlib.h>
#define width 400
#define height 599
#define k_size 3
void meanFilter(unsigned char input[width][height], unsigned char output[width][height]) {
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int sum = 0;
for (int m = 0; m <= k_size-1; m++) {
for (int n = 0; n <= k_size-1; n++) {
int row = i + m; int col = j + n; /*boundaries*/
if(row >= 0 && row < width && col >= 0 && col < height) {
sum += input[row][col];
}
}
}
output[i][j] = sum / (k_size*k_size);
}
}
puts("mean filter applied.");
}
我想我已经了解了几乎所有内容,除了如何访问
input
和 output
数组,例如 input[row][col]
和 output[i][j]
。我已将宽度和高度定义为单词,以及考虑到其 .GRAY 文件,整个图像应占用的空间 (width
* height
)。
预先感谢!
对于计算数组访问,RISC V 没有什么必然特定的 — 大多数现代计算机都使用字节寻址。
使用两个索引计算放在一起来访问二维矩形数组。
因此,首先计算
input[row]
产生中间地址,例如 aRow
,然后计算 aRow[col]
。
要计算任意
A[i]
的地址,您需要以下简单公式: A + i * scale
— 其中,scale 是数组元素的字节数。对于字节数组,scale 为 1;而对于 32 位字数组,标度为 4。
对于结构体数组,标度是结构体的大小(以字节为单位);而对于矩形二维数组,有两个比例值,一个用于第一个数组索引,即列的大小,而对于第二个索引,则为单元格大小的比例值。
在计算
input[row]
时,您可以类似地计算 input + row * scale
,其中比例是整个列的字节数。该计算产生一个指向某个整列的开头的地址。第二次索引计算定位二维数组中单元格的起始地址。
一旦有了地址,您就可以根据需要取消引用(读或写)以访问给定的单元格。
某些处理器具有复杂的寻址模式,允许包含某些缩放而不是显式计算。但您不必使用它们,当您显式计算单元格时,调试起来会更容易,因为您可以看到该计算。
RISC V 没有任何复杂的寻址模式,因此您只需计算单元的完整地址并使用它间接访问单元内容。