Виж темите без отговор | Виж активните теми
Дата и час: Пет Мар 29, 2024 12:21 am
"C" въпрос, как се прави това?
Автор |
Съобщение |
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
"C" въпрос, как се прави това?
Здравейте, опитвам се ... и да науча Ц-то Имам асемблерски файл, от който трябва да извлека данни: Особеното е, че за икономия на място искам да ползвам по-късата таблица ATable1words (с относителни спрямо началото на сегмента адреси) вместо по-дългата таблица ATable1longs (с абсолютни адреси). Имам проблем с добавянето на базата към относителния адрес. Как е коректно да се направи това?
|
Чет Май 10, 2018 7:52 am |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
май го нацелих, сега минава:
Bptr1+=( long)AsmSegStart; // добавяне на базата Bptr3+=( long)ConstAsmSegStart; // добавяне на базата Bptr1+=(long)(&ATable1words);
|
Чет Май 10, 2018 8:26 am |
|
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 10:53 pm Мнения: 4174 Местоположение: Brussels / Пловдив
|
Re: "C" въпрос, как се прави това?
По правилно е да не cast-ваш т.е. нещо ей такова Едит: Не ми харесва как е дефиниран AsmSegStart и най вероятно няма да се получи резултатът който очакваш. Я обясни какво точно искаш да направиш, за да поправя примера ...
_________________ Мразя да мразя ...
|
Чет Май 10, 2018 11:52 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
Имам 2 -3 такива файла, точките Apoint0,Apoint1..ApointN са неща ,които мога да опиша като структури , но това ще го оставя за по-нататък. В конкретния файл тия структури са с променлива дължина - байт 0 показва ,колко колони е широк символът , байт 1- колко празни реда трябва да се добавят отгоре, байт 2 -не си спомням сега -май брой редове, байт 3 - колко байта описват една колона, следва различен брой байтове за самите точки - колона, колона....последна колона. В другите случаи структурите са с почти еднаква дължина , например описват менюта - когато менюто е въпрос от типа - ДА/НЕ , към него няма номер на структура -описваща пък данните за редактиране . В такъв случай съм си спестявал някой байт в края на структурата за меню . Там ще ги допълня за да е униформена работата, но в случая с шрифтовете ще си е чиста загуба.
|
Пет Май 11, 2018 6:19 am |
|
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 12:01 pm Мнения: 2201
|
Re: "C" въпрос, как се прави това?
Мисля, че много сложно си го представяш и съответно много сложно го правиш. До колкото разбирам искаш да вкараш в един масив структури от данни. Аз бих направил една стандартна фукция(примерно serialiser), на която да подавам указател към свободна позиция от буфера, указател към структурата и броя на байтовете в структурата. Функцията ще връща броя на байтовете, които са добавени и така ще знаеш коя е следващата свободна позиция..
_________________www.elkran.com
|
Пет Май 11, 2018 5:52 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
Направил съм го отдавна, сега го превеждам на Ц. За мене не е сложно направено, поне щом си го разбирам. В конкретния случай става дума за фонт и бързото му извличане . Може със структура на Ц да стане пак бързо, но вероятно ще ми нарастне и стека. Това ше го гледам с другите структури. Шрифтът ще го подкарам така, ако не настъпя някоя мотика, де.
|
Пет Май 11, 2018 6:14 pm |
|
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 12:01 pm Мнения: 2201
|
Re: "C" въпрос, как се прави това?
Виж как го правя аз. Моят фонт е генериран от програмка, която един колега ми даде. Трябва да е тук някъде темата. Програмката генерира къстъм фонт, какъвто си пожелаеш. Имаш 3 масива от данни - първият съдържа символите, вторият съдържа позицията на първият байт на даден символ в масив 1, третият съдържа широчината на символа. Като знаеш колко е височината шрифта и третия масив изчисляваш колко байта има. Програмката ти е проста - подаваш на функцията символ(примерно 'а') и това е първата буква в азбуката и съответно в масива. Функцията изважда от 'а' 97, за да превърне символът в номер - 0(първи елемент). От масив 2 намира, кой е първият значещ байт на големия масив. После изчислява колко байта има в този символ - височината на шрифта умножена по числото на съответната позиция на масив 3. След това програмата ти просто чете необходимият брой байтове от големия масив като започне от стартовата позиция. Моята програма е малко по-съвършенна като връща крайните пиксели на дадем символ, за да се изчисли позицията на следващият символ и буквите да са с константно разстояние една от друга. Също така използвам и няколко шрифта. По-сложните програми могат и да интерполират символите, за да сменят размера. Вече зависи при теб в какъв формат е фонта и как го визуализираш точно. При мен това действа и е относително просто. Още нещо, не знам в какво държиш фонта, но обикновено Ц не дава да насочваш указател към константа, т. е. трябва да го заредиш в РАМ-а... Сега може твоят компилатор да дава... Ако ти трябва пример кажи да търся файлове и да ти кача!
_________________www.elkran.com
|
Пет Май 11, 2018 7:08 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
Stoyqnoff, не си прав, не искам да си оспамвам сам темата, ма...кво да те прявя. Колко байта отделяш за представянето на шпацията в шрифт с височина 30 реда и ширина средно 13 пиксела ? Използвам няколко шрифта, някои са големи, ама ми трябват само цифрите , точката и знака минус. Схващаш ли? ЛЦД с контролер Т6963 е съвсем различно от UC1608. И когато имаш малко рам- нещата се усложняват. Шрифтовете са ми с различен брой символи, основният обхваща източна Европа, високият -само цифрите. Не ми продавай шрифтове. Ако си наясно как да имплеметирам Bitstream Fusion - направи ми оферта.
|
Пет Май 11, 2018 9:29 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
И защо ? Ако искаш да си дисциплиниран - обявяваш ,че указателят е към константа, недей да пишеш в константата и Ц-то ще е хепи.
|
Пет Май 11, 2018 9:32 pm |
|
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 12:01 pm Мнения: 2201
|
Re: "C" въпрос, как се прави това?
Не мога да разбера какво се товариш?! Дадох ти пример как може да си построиш програмата. Аз последно правих меню за ST7735 с контролер, който има само 32к FLASH и 2k RAM. Като използвам 3-4 различни фонта и менюто е сериозно(70% от ресурса на контролера). Аз не съм казал, че вариантът, който ти предлагам е идеален за твоя случай. Налага се да го пригодиш - примерно не е необходимо да слагаш целия фонт в кода, а само символите, които смяташ да използваш... И не ти продавам нищо, а се опитвам да ти покажа как да си решиш проблемите. Ако искаш утре ти кача програмката, която обръща имволи във фонт. Зареждаш си необходимите символи от необходимия фонт - и после си правиш, каквото ти харесва. Може даже снимка да обърне. Или потърси темата ако бързаш.
_________________www.elkran.com
|
Пет Май 11, 2018 10:18 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
Не се товаря,бре, винаги си добре дошъл. Обичам ,когато става спор. Поздравления за TFT-то. За темата - ще е интерено да постнеш част от кода за визуализация.
|
Съб Май 12, 2018 6:53 am |
|
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 12:01 pm Мнения: 2201
|
Re: "C" въпрос, как се прави това?
Ето това ми е основната функция: Подавам и координати по x и y, буква(символ), фонт и цвят. Символът го трансформирам така че да го намеря в масива на фонта и го визуализирам. Какво имаш в предви под кода за визуализация?! Самата функция, която рисува по дисплея?! Или тази, която обръща бит от данна в пиксел?!
_________________www.elkran.com
|
Съб Май 12, 2018 1:22 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
unsigned int DisplayLetter(char x0, char y0,char symbol,char fontID, unsigned int color)
Покажи тази например.
|
Съб Май 12, 2018 2:43 pm |
|
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 12:01 pm Мнения: 2201
|
Re: "C" въпрос, как се прави това?
| | | | Код: unsigned int DisplayLetter(char x0,char y0,char number,char fontID, unsigned int color) { long int ulOffset; char j,y,xx,i,w; char part1,rowCounter; char letterWidth=GetLetterWidth(fontID,number); char letterHeight=GetLetterHeight(fontID,number); ulOffset=GetLetterOffset(fontID,number);
j=0; rowCounter=0; while(rowCounter<letterHeight) { w=0; while(w<letterWidth) { part1=GetLetterNibble(fontID,j+ulOffset,number); j++; for(i=0;i<8;i++) { if(bittest(part1,i)) { xx=x0+8+w*8-i; y=y0+rowCounter; drawPixel(xx, y+y0, color); } } w++; } rowCounter++; } return letterWidth; }
| | | | |
_________________www.elkran.com
|
Съб Май 12, 2018 8:08 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
Да попитам нещо "теоретично".
char func1(void) { func2(); func3(); func4(); return 1; }
char func0(void) { if..... return func1();else return func111(); }
Функцията func1 връща резултат "1" , важното е да се изпълнят всичките и редове. Но ме гложди съмнение , че един оптимизиращ компилатор може да "прескочи" извикването на func2,3,4 и направо да върне "1", или още по-"оптимизирано" - във функцията func0 -да замести извикването "func1()" с "return 1", а цялото тяло на func1 да бъде премаханато от кода. Възможно ли е това,или стандартите не го позволяват? Ако е възможно - как се предотвратява?
|
Нед Юни 03, 2018 7:14 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|