Jump to content

    

__inline__

Участник
  • Content Count

    1012
  • Joined

Community Reputation

0 Обычный

1 Follower

About __inline__

  • Rank
    Профессионал

Recent Profile Visitors

2837 profile views
  1. Вот я и говорю, что фолты по невыровненному доступу - почти добрая половина ошибок при работе с памятью. А ещё меня дураком пытаются выставить такие как jcxz ! Просто завидуют: ведь Allwinner уделал C6745 до слёз , а для jcxz этот DSP - это "священная корова" Вот и хейтит он мои посты теперь, прикапываясь по мелочам. hacker_fox тоже уже на подходе, почти...
  2. В каком месте? Кто этот кто-то и какие левые советы он дал в этой теме? В каком месте и кого именно я ввёл в заблуждение? Каких коллег вы имеете в виду? Перечислите.
  3. Вы наверное будете удивлены, что мне совершенно безразлично что вы там считаете о моей адекватности или её отсутствии. Слишком всё уныло обобщаете. Я даже не буду тратить своё время на дальнейшее разжёвывание. В данном случае я просто стебусь и не более. В таком состоянии бесполезно меня взывать к ответам. Тем более данный форум - ничем не обязывает. Так что смиритесь с тем, что мои посты будут у вас вызывать раздражение. Более того, вы можете внести в ЧС мой ник и более сообщений от меня не увидите. Но вот так воспаляться по каждому моему посту - это уже похоже на ничем непрекрытое хейтерство )))) Найдите себе другого субъекта для битья. А ещё лучше - поберегите свои нервы и время!
  4. Ага, по вашему STM32H743 это не Cortex-M7 ? Тут вы и попались! Не хочу...
  5. У меня на BlackFin и STM32 были исключения из-за невыровненной памяти. А вот в C6745 просто читался мусор, пока не заиспольовал _mem(), _mem8(). Тоесть компилятор почему-то подставляет инструкции, не учитывающие доступ по невыровненным адресам. Пользуясь случаем, глянул в сорцы эмуля СЕГи, который когда-то адаптировал под C6745 и увидел, что использование инструкций через интринсики, дало увеличение производительности чуть-ли не в 2 раза в рендерере эмулятора: вместо 4-х побайтовых обращений используется - ОДНА инструкция с невыровненным доступом, что очень сильно увеличивает скорость: #define ALIGN_LONG 0 /* !!! unaligned word */ #if ALIGN_LONG /* Or change the names if you depend on these from elsewhere.. */ #undef WRITE_LONG static __inline__ void WRITE_LONG(void *address, uint32 data) { *((uint8 *)address++) = data; *((uint8 *)address++) = data>> 8; *((uint8 *)address++) = data>>16; *((uint8 *)address ) = data>>24; return; } #endif #if ALIGN_LONG /* Draw a single 8-pixel column */ #define DRAW_COLUMN(ATTR, LINE) \ atex = atex_table[(ATTR >> 13) & 7]; \ src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ WRITE_LONG(dst++, *src++ | atex); \ WRITE_LONG(dst++, *src++ | atex); \ ATTR >>= 16; \ atex = atex_table[(ATTR >> 13)/* & 7*/]; \ src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ WRITE_LONG(dst++, *src++ | atex); \ WRITE_LONG(dst++, *src++ | atex); \ #else #define DRAW_COLUMN(ATTR, LINE) \ atex = atex_table[(ATTR >> 13) & 7]; \ src = (uint32*)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ _mem4(dst++) = (_mem4(src++) | atex); \ _mem4(dst++) = (_mem4(src++) | atex); \ ATTR >>= 16; \ atex = atex_table[(ATTR >> 13) & 7]; \ src = (uint32*)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ _mem4(dst++) = (_mem4(src++) | atex); \ _mem4(dst++) = (_mem4(src++) | atex); \ #endif #if ALIGN_LONG /* Draw a single 16-pixel column */ #define DRAW_COLUMN_IM2(ATTR, LINE) \ atex = atex_table[(ATTR >> 13) & 7]; \ offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ if(ATTR & 0x1000) offs ^= 0x40; \ src = (uint32 *)&bg_pattern_cache[offs]; \ WRITE_LONG(dst++, *src++ | atex); \ WRITE_LONG(dst++, *src++ | atex); \ ATTR >>= 16; \ atex = atex_table[(ATTR >> 13)/* & 7*/]; \ offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ if(ATTR & 0x1000) offs ^= 0x40; \ src = (uint32 *)&bg_pattern_cache[offs]; \ WRITE_LONG(dst++, *src++ | atex); \ WRITE_LONG(dst++, *src++ | atex); \ #else #define DRAW_COLUMN_IM2(ATTR, LINE) \ atex = atex_table[(ATTR >> 13) & 7]; \ offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ if(ATTR & 0x1000) offs ^= 0x40; \ src = (uint32*)&bg_pattern_cache[offs]; \ _mem4(dst++) = (_mem4(src++) | atex); \ _mem4(dst++) = (_mem4(src++) | atex); \ ATTR >>= 16; \ atex = atex_table[(ATTR >> 13) & 7]; \ offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ if(ATTR & 0x1000) offs ^= 0x40; \ src = (uint32*)&bg_pattern_cache[offs]; \ _mem4(dst++) = (_mem4(src++) | atex); \ _mem4(dst++) = (_mem4(src++) | atex); \ #endif Если же выравнивание никак не учитывать (не применять _mem*() или не делать побайтовое чтение) , то эмулятор просто повисает и вылетает в data misaligned Exception :) Класс! Вполне исчерпывающий ответ!
  6. Компилятор здесь не причём. Я говорил о случае, когда идёт чтение short по адресу не кратному 2 или long по адресу не кратному 4. Хотя бы вот такой пример: short a=*(short*)(0xC0000001); int b=*(int*)(0xC0000007); Надеюсь, не надо пояснять, к чему приведут такие обращения к памяти? Мы не знаем как автор топика обращается к данным, а это значит, что имею право предположить что выше
  7. __Мои__ предположения: 1) Нет контакта со стробом чтения или других контактов (проверить качество контактов MPU, DRAM и на предмет К.З.) 2) Неисправная память или не подходит по времянкам 3) Ошибка в соединении DRAM и MPU. Плата своя или фирменная? 4) Что-то не так с выравниванием данных в программе (short д.б. выравнены на 2 байта, long - на 4, long long - на 8). Без текста программы тестилки - гадание на кофейной гуще.
  8. https://vrtp.ru/index.php?showtopic=29688&st=30 https://vrtp.ru/index.php?act=Attach&type=post&id=765613
  9. Уже поздно, кнопка Edit Post отсутствует. К тому же вы также внесли свою лепту и размножили этот пост: Да и чего вы так боитесь? Умный всё поймёт правильно. А дурак не осилит. Тем более вы писали: Ваша просьба удовлетворена.
  10. А меня задевает, что у вас позиция: "Я - Д'Артаньян, а остальные пи****сы", иначе как понять ваше высказывание про: Скажу так, что мне необязательно разбираться в кишках аллокатора, более того, я туда не лез. Так что вы лжёте по поводу: Интересно, кто вы собственно такой, чтобы давать такие заключения другим людям? Вам легче станет, если скажу, что "замедление-сбой-подвисание" - это следствие того, что malloc вернул NULL, и программа пошла шагать дальше, а не застопорилась, как сделано в последнем случае? Вы имеете право думать о чём угодно. Я имею право писать о чём угодно. В интернете, вам никто ничем не обязан. А раз выкладываете свой код для пользования другими, будьте готовы увидеть любые отзывы, в том числе невыгодные вам ! Ваш диалог уже получается НЛП какое-то: насквозь прошпигован угрозами и призывом к ответственности. Далеко пойдёте... Напоследок скажу, ваш аллокатор неоптимально использует пул памяти, по сравнению с другими. Надеюсь, я оставил вас довольным своим ответом! И скажите спасибо, что вашему аллокатору выделил своё время ДВАЖДЫ!
  11. Декодер H264 напрашивается. Там хорошее сжатие между фреймами и опенсорцный. Можно настроить качество не хуже JPEG. Странные клиенты. Чем ведро многоядерное по типу планшета их не устроило?
  12. Убедили! Всё-же ещё раз выделил квант своего времени и ещё раз всё проверил, сделал контрольную проверку возвращаемого значения после malloc. На голом железе. Там один поток. Есть прерывание для подкачки данных для звука, но там статическое распределение - буфер постоянной длины: обычный массив. Проверка показала, что malloc вернул NULL спустя какое-то время, дисплей покрасился в красный цвет, и далее я сделал вечное зацикливание. Недостаточно памяти. Данный аллокатор либо неэффективно (по сравнению с другими) использует кучу, либо куча сильно фрагментировалась. Пул 24 Мегабайта. Адрес пула 0xC2000000 - выравнивание - овердофига, чем надо. Штатный и zltig'овский аллокаторы с этим пулом работают, ошибок выделения памяти нет. Условия теже самые. Ниже обёртка, на которой тестировались все сторонние аллокаторы: /* o1.cpp cpp-wrapper for o1heap */ #include <string.h> //#include <stdio.h> #include <stddef.h> #include "o1heap.h" #include "API.h" //это API для работы с дисплеем, звуком, и т.п. static O1HeapInstance *o1i; #define HEAP_MEMORY_SIZE (24UL*0x100000UL) /* 24 МБ */ //static char HEAP_MEMORY[HEAP_MEMORY_SIZE] __attribute__ ((aligned (64))); //это для винды static char *HEAP_MEMORY=(char*)0xC2000000; //с этого адреса лежит пул кучи (свободный участок, неиспользуемый более никем) extern "C" void *malloc(size_t size) { static char f=1; if(f) { o1i=o1heapInit((void*)HEAP_MEMORY,HEAP_MEMORY_SIZE,NULL,NULL); //одноразово инитим аллокатор f=0; } void *r; if(!size) { // printf("malloc size=0\n"); return NULL; } r=o1heapAllocate(o1i,size); // if(r)printf("malloc=%d\n",size); // else printf("malloc error: not enougth memory\n"); if(r==NULL) //если выделить не удалось { ClearVRAM(COLOR_RED); //заливаем буфер видео красным цветом OutLCD(); //выводим буфер на дисплей while(1); //зацикливаем навечно } return r; } extern "C" void free(void *ptr) { // printf("free\n\n"); if(ptr==NULL)return; o1heapFree(o1i,ptr); } extern "C" void *calloc(size_t num,size_t size) { // printf(" CALLOC "); size_t ns=num*size; void *r=malloc(ns); if(r)memset(r,0,ns); return r; } extern "C" void *realloc(void *ptr,size_t newsize) { // printf(" REALLOC "); if(ptr==NULL)return malloc(newsize); //только выделяем if(newsize==0) //только освобождаем { free(ptr); return NULL; } void *new_ptr=malloc(newsize); memcpy(new_ptr,ptr,newsize); //копируем старый фрагмент в новый free(ptr); return new_ptr; } void *operator new(size_t sz) { // printf(" NEW 1 "); return malloc(sz); } void *operator new[](size_t sz) { // printf(" NEW 2 "); return malloc(sz); } void operator delete(void *ptr) { // printf(" DELETE 1 "); free(ptr); } void operator delete[](void *ptr) { // printf(" DELETE 2 "); free(ptr); }