Forráskód :
#include "xparameters.h"
#include "stdio.h"
#include "xutil.h"
#include "xuartlite.h"
#include "xuartlite_l.h"
#include "xintc_l.h"
#include "xgpio.h"
//====================================================
// Definitions
//====================================================
#define BAUDRATE 115200
#define USE_PARITY 0
#define PARITY_ODD 1
#define DATABITS 8
//====================================================
// GLOBAL VARIABLES
//====================================================
int data;
XUartLite serial;
u32 *intimage=(u32*)XPAR_MICRON_RAM_MEM0_BASEADDR;
Xuint8 szelesseg=0, magassag=0;
Xuint8 x=0, y=0;
unsigned int sor_osszeg;
Xuint8 flag=0;
//====================================================
// INTERRUPT HANDLER FUNCTION
//====================================================
void uart_interrupt_handler(void* addr_p)
{
int empty;
empty = XUartLite_IsReceiveEmpty(XPAR_RS232_PORT_BASEADDR);
if (empty == FALSE )
data = XUartLite_RecvByte(XPAR_RS232_PORT_BASEADDR);
if(flag==1) //itt olvassuk be a kepmeretet.
{
intimage[x+szelesseg*y]=data;
x=x+1;
if(x>szelesseg)
{
y=y+1;
x=0;
}
}
if(flag == 2)//itt olvassuk be az adatokat.
{
if(szelesseg > 0)
magassag = data;
else szelesseg = data;
if((szelesseg > 0)&&(magassag > 0)) flag = 0;
}
}
int main()
{
unsigned int i;
//XUartLite serial;
//XUartLite_Config UART_Configuration;
//UART_Configuration.DeviceId = XPAR_RS232_SECOND_DEVICE_ID;
//UART_Configuration.RegBaseAddr = XPAR_RS232_SECOND_BASEADDR;
//UART_Configuration.BaudRate = BAUDRATE;
//UART_Configuration.UseParity = USE_PARITY;
//UART_Configuration.ParityOdd = PARITY_ODD;
//UART_Configuration.DataBits = DATABITS;
//
// //UART init:
//XUartLite_CfgInitialize (&serial, &UART_Configuration, XPAR_RS232_PORT_BASEADDR) ;
//
//xil_printf("UART configured to send any data.\n");
////-----------------
XIntc_RegisterHandler(XPAR_XPS_INTC_0_BASEADDR,
XPAR_INTC_0_UARTLITE_1_VEC_ID,
(XInterruptHandler)uart_interrupt_handler,
(void *)XPAR_RS232_PORT_BASEADDR);
XIntc_MasterEnable(XPAR_XPS_INTC_0_BASEADDR);
XIntc_EnableIntr(XPAR_XPS_INTC_0_BASEADDR, 0x1);
XIntc_EnableIntr(XPAR_XPS_INTC_0_BASEADDR, XPAR_RS232_PORT_INTERRUPT_MASK);
XUartLite_Initialize(&serial,XPAR_RS232_PORT_DEVICE_ID);
XUartLite_SetRecvHandler(&serial,
(XUartLite_Handler) uart_interrupt_handler,
(void *)XPAR_RS232_PORT_BASEADDR);
XUartLite_EnableInterrupt(&serial);
microblaze_enable_interrupts();
xil_printf("Add meg a kep szelesseget es magassagat. \n");
flag = 2;
while(flag == 2);
xil_printf("Szelesseg = %d Magassag = %d\n",szelesseg,magassag);
xil_printf("Kuldjed a pixel ertekeket, balrol jobbra es fentrol lefele. \n");
x=0;
y=0;
flag=1;
while(y<magassag);
flag = 0;
for (x=0;x<szelesseg-1;x++)
{
intimage[x+1]=intimage[x]+intimage[x+1];
xil_printf("X : %d, INT[x] = %d\n",x+1,intimage[x+1]);
}
xil_printf("-----------------------Elso sor megvan.-----------------------\n");
for(y=1;y<magassag;y++)
{
for(x=0;x<szelesseg;x++)
{
sor_osszeg = sor_osszeg+intimage[y*szelesseg+x];
intimage[y*szelesseg+x]=intimage[(y-1)*szelesseg+x]+sor_osszeg;
xil_printf("X = %d, Y = %d, INT = %d\n",x,y,intimage[y*szelesseg+x]);
}
sor_osszeg = 0;
}
xil_printf("-----------------------Vegeztunk.-----------------------\n");
}
Úgy érzem, nem igazán kell kommentárt hozzáfűzzek. Interruptban lekezeljük az érkező információt, majd miután minden pixelérték megérkezett, fogjuk és kiszámoljuk belőle az integrálkép értékét. Figyelni kell mindenképp a változók tipusára, mert Xuint8-ban csak 255-ig tudunk elszámolni. Vagyis, ha 255-nél nagyobb valamelyik paraméterünk (szélesség vagy magasság), akkor mindenképp meg kell változtatni a tipust Xuint16-ra, vagy valami hasonlóra.
Mégegy érdekesség : Rengeteget használom a ledeket, hogy a lehetséges hibákat észrevegyem és ki tudjam küszöbölni. Ha benne vannak a ledek is a programban, (vagyis debug mód), akkor
mb-size TestApp_Memory_microblaze_0/executable.elf
text data bss dec hex filename
10470 412 2210 13092 3324 TestApp_Memory_microblaze_0/executable.elf
ha meg nincs benne, akkor
mb-size TestApp_Memory_microblaze_0/executable.elf
text data bss dec hex filename
8602 380 2190 11172 2ba4 TestApp_Memory_microblaze_0/executable.elf
Erre is érdemes odafigyelni, ha az ember egy nagyobb projektet készül megvalósítani. Egy kis fölösleges ledvillogtatás, és már nem is férünk bele a memóriába.
Röviden ennyi mára. Asszem átnézem egy kicsit a kinematikát, mert abból még nagyon zéró vagyok.
0 megjegyzés:
Megjegyzés küldése