Portál AbcLinuxu, 5. května 2025 20:57

Dotaz: framebufer - nemůžu smazat celou obrazovku.

2.11.2016 17:39 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
framebufer - nemůžu smazat celou obrazovku.
Přečteno: 401×
Odpovědět | Admin
Příloha:
Mám program pro kreslení na obrazovce a nemůžu smazat poslední řádky, vyhodí to chybu:
The framebuffer device was opened successfully.
1366x768, 32bpp
The framebuffer device was mapped to memory successfully.
Neoprávněný přístup do paměti (SIGSEGV) (core dumped [obraz paměti uložen])
Ale když v funkci nebudu chtít smazat posledních 6 řádků "vinfo.yres-6" tak to funguje OK.
void clear_fb(int r, int g, int b)
{
int y_pom;
int x_pom;

for ( y_pom = 0; y_pom < vinfo.yres-6; y_pom++ )
        for ( x_pom = 0; x_pom < vinfo.xres; x_pom++ ) {

            location = (x_pom+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +
                       (y_pom+vinfo.yoffset) * finfo.line_length;

            if ( vinfo.bits_per_pixel == 32 ) {
                *(fbp + location) = b;        // Some blue
                *(fbp + location + 1) = g;     // A little green
                *(fbp + location + 2) = r;    // A lot of red
                *(fbp + location + 3) = 0;      // No transparency
            } else  { //assume 16bpp
                unsigned short int t = r<<11 | g << 5 | b;
                *((unsigned short int*)(fbp + location)) = t;
            }
 }
}
Někde mám nějakou chybičku neporadíte kde?

Celý program v příloze.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

3.11.2016 08:32 MM
Rozbalit Rozbalit vše Re: framebufer - nemůžu smazat celou obrazovku.
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahoj,

Vypadá to, že zapisuješ do paměti, která ti nepatří

já bych asi hledal kolem finfo.line_length (vypsat si), když mmapuješ, používáš screensize, který počítáš jinak než pak location v clear_fb a to může pak zapisovat do nemmapované paměti.

Tzn. vypsat si celkový screensize a kontrolovat, že location ve funkcích není větší než... a když jo případně vypsat a nezapisovat do té paměti a hledat proč. Rozhodně počítat pokud možno stejným způsobem location a screensize

3.11.2016 12:17 R
Rozbalit Rozbalit vše Re: framebufer - nemůžu smazat celou obrazovku.
Ano, line_length bude asi vacsi ako xres. 1366x768 je totiz debilne rozlisenie, sirka nie je nasobkom 8...
3.11.2016 15:56 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: framebufer - nemůžu smazat celou obrazovku.
Jo tady bude zrada nechal jsem si vypsat velikost řádku a je větší jak 1366x4 takže podle mě budu mít špatně spočítaný screensize.

Díky za nakopnutí půjdu to přepočítat.....
3.11.2016 16:37 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: framebufer - nemůžu smazat celou obrazovku.
Je to tak, prostudoval jsem proměnné a screensize už nepočítám - vždyť v proměnných ho mám už spočítaný :-(
screensize = finfo.smem_len;
Jo třeba projít proměnné a použít správné :-)

Díky za nakopnutí....

Zdá se že už je to OK.

Samozřejmě jsem blbě počítal screensize pak byl menší protože u nestandartního rozlišení je řádek větší v framebuferu než se skutečně zobrazuje.
3.11.2016 14:52 Marek Sulik
Rozbalit Rozbalit vše Re: framebufer - nemůžu smazat celou obrazovku.
Odpovědět | | Sbalit | Link | Blokovat | Admin
hmm,

tak ja tipujem, ze ten smernik fbp je typu (int*).

takze potom: unsigned short int t = r<<11 | g << 5 | b;

*((unsigned short int*)(fbp + location)) = t;

Ide mimo rozsah, lebo tam bude dany pocet unsigned short int-ov.

fpb + location

sa posunie na lokalitu o location int-ov dalej.

takze by som spravil na zaciatku premennu ( kvoli rychlosti ): unsigned short int *fbp_us = (unsigned short int*)fbp;

a potom pouzival ju takto: *(fbp_us + location) = t;

alebo iba jednoducho pretypovat na (unsinged short int*) pred operaciou + location;

3.11.2016 15:12 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: framebufer - nemůžu smazat celou obrazovku.
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejsem žádný C guru, ale když dumpuje core a zkompiloval by se s debug stringy (-g), tak by to v gdb nemusel být problém dohledat, ne?
3.11.2016 15:49 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: framebufer - nemůžu smazat celou obrazovku.
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je mi jasné že zapisuji mimo paměť asi to budu muset začít ladit tím že budu vypisovat kam to zapisuje do nějakého logu.

Jinak to chci použít na RPI 3 tam to funguje OK sice tam používám menší rozlišení a pouze 16bpp.

Takže zrada bude v tom počítání location.
4.11.2016 11:01 Jirka
Rozbalit Rozbalit vše Re: framebufer - nemůžu smazat celou obrazovku.
Jak už zde naznačil předřečník, k ladění takových chyb obvykle stačí použít např. gdb nebo valgrind.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.