Jump to content

    

Legath

Участник
  • Content Count

    38
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Legath

  • Rank
    Участник
  • Birthday 09/08/1988

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Рязань
  1. Доброго дня. Прошу помощи в понимании взаимодествия частот DSI интерфейса на STM32F769. Вопрос заключается в следующем - согласно каким правилам выставляются частоты DSI line byte и DSI txclkesc ? Завожу дисплей на контроллере ili9881c, скриншот из даташита далее, в нем имеется следующая формула Пытаюсь правильно высчитать тайминги и не понимаю как связаны частоты DSI и LTDC. Правильно ли я понимаю что параметры LTDC определяются исходя из таблицы в даташите дисплея? А битрейт берется из частоты DSI. Буду признателен за любые комментарии
  2. Порт Cortex-R4

    Все оказалось намного проще. порт arm7 полность подходит для cortex-r4 , за исключение плавучки, но это решается дефайнами. Работает. Но есть одна неприятность, работает только первый процесс , при попытке передачи управления процессу 2 возникает ошибка как в самом начале, sp для второго процесса указывает далеко. сейчас занимаюсь с этим.
  3. Порт Cortex-R4

    Цитата(dxp @ Jan 22 2017, 11:08) В gcc'шной библиотеке есть специальная функция для прогона ctor loop: ___libc_init_array. Вообще, стартап к кортексов может быть очень простым. Да там это все safety проверки. На данном этапе проекта если их все закомментировать ничего не изменится. Попробую ___libc_init_array ибо ни один из бряков в конструкторах не сработал снова.
  4. Порт Cortex-R4

    Файлы ccs7 архивировал. код инициализации я вставлял в source/sys_startup.c Вообще хочется самому разобраться, чтоб понимать до конца как все работает. Поэтому прямо мне решение не сообщайте
  5. Порт Cortex-R4

    Цитата(Сергей Борщ @ Jan 20 2017, 21:24) for(;;) в main() не нужен - OS::run() - это путь в один конец, возврата из нее нет. Это понятно. Я б не стал пытаться делать порт без базовых знаний Цитата(Сергей Борщ @ Jan 20 2017, 21:24) for (int i=0;i<10;i++) в процессах тоже лишнее - любой вменяемый компилятор этот цикл выкинет при самой минимальной оптимизации. -O0 , gcc 5.4.1 оставляет если верить дизассемблеру Цитата(Сергей Борщ @ Jan 20 2017, 23:42) да, точно. У меня-то они объявлены как Кодextern void(* const __ctors_start__[])(); extern void(* const __ctors_end__[])();странно, что компилятор не выругался на несоответсвие типов. Действительно не ругается. Странно что ругается на редекларацию регионов памяти. Код/Users/legath/Downloads/gcc-arm-none-eabi-5_4-2016q2/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/bin/ld:/Users/legath/rm46_temp/source/sys_link.ld:19: warning: redeclaration of memory region `VECTORS' /Users/legath/Downloads/gcc-arm-none-eabi-5_4-2016q2/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/bin/ld:/Users/legath/rm46_temp/source/sys_link.ld:20: warning: redeclaration of memory region `FLASH' /Users/legath/Downloads/gcc-arm-none-eabi-5_4-2016q2/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/bin/ld:/Users/legath/rm46_temp/source/sys_link.ld:22: warning: redeclaration of memory region `RAM' /Users/legath/Downloads/gcc-arm-none-eabi-5_4-2016q2/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/bin/ld:/Users/legath/rm46_temp/source/sys_link.ld:23: warning: redeclaration of memory region `MEMORY_B1' CPU_STACK я убрал и память одним куском оставил
  6. Порт Cortex-R4

    Добавил в линковку Код  /* The program code and other data goes into RAM */   .text :   {         __ctors_start = .;         KEEP(SORT(*)(.init_array))  /* eabi uses .init_array for static constructor lists */         __ctors_end = .;         __dtors_start = .;         __dtors_end = .;     . = ALIGN(4);     *(.text)           /* .text sections (code) */     *(.text*)          /* .text* sections (code) */     *(.glue_7)         /* glue arm to thumb code */     *(.glue_7t)        /* glue thumb to arm code */     *(.eh_frame)     KEEP (*(.init))     KEEP (*(.fini))     . = ALIGN(4);     _etext = .;        /* define a global symbols at end of code */   } >FLASH и перед вызовом main в аналоге reset handler Код        extern uint32 __ctors_start, __ctors_end;     void(* const *ctor)();     for( ctor = __ctors_start; ctor < __ctors_end; )             (*ctor++)(); Все равно очень далеко указывает R0 указывает. Видимо я еще что то не учел.
  7. Порт Cortex-R4

    Цитата(Сергей Борщ @ Jan 20 2017, 12:21) Кажется понял - область одна, но в скрипте автор зачем-то окусил от нее кусок для стека. Ему виднее, зачем он так сделал. Это дефолтный скрипт из HalCoGen (аналог CubeMX для процессоров TI). Я просто не нашел другого способа получить инициализацию. Но теперь более менее понятно что можно вернуть область RAM в единую. Порт Free RTOS от TI еще больше ее дробит. Там ядро (шедулер? ) лежит в своем сегменте КодKRAM (xrw)      : ORIGIN = 0x08000800, LENGTH = 0x00000800 Цитата(Сергей Борщ @ Jan 20 2017, 12:21) А конструкторы глобальных объектов вообще вызываются? У множества распроняемого в интернете и в "библиотеках" начального кода запуск конструкторов просто не реализован. Подозреваю что не вызываются. S/W BP ниразу не сработал внутри TKernel::register_process. Цитата(Сергей Борщ @ Jan 20 2017, 12:21) Ваш процессор переключает аппаратно стек при входе в прерывания? Чтобы ответить на этот вопрос мне не хватает знаний на данный момент . В документации я нашел Software normally uses register R13 as a Stack Pointer (SP). The SRS and RFE instructions use Register R13 И для каждого из режимов процессора R13 имеет свой суффикс(в вашем порте arm7 я видел подобное) Ссылаюсь на документацию от ARM тестовый код main.cpp Код#include "sys_common.h" #include "gio.h" #include <scmRTOS.h> typedef OS::process<OS::pr0, 300> TProc0; typedef OS::process<OS::pr1, 300> TProc1; TProc0 Proc0; TProc1 Proc1; int main(void) {     OS::run();     while(1){     }     return 0; } namespace OS {     template <>     OS_PROCESS void TProc0::exec()     {         for(;;)         {   for (int i=0;i<10;i++)             {             }             sleep(10);         }     }     template <>     OS_PROCESS void TProc1::exec()     {         for(;;)         {             for (int i=0;i<10;i++)             {             }             sleep(10);         }     } }
  8. Порт Cortex-R4

    Цитата(Сергей Борщ @ Jan 20 2017, 09:18) Там есть общий порт для Mx (x=0, 3, 4) под gcc, его нельзя доработать? И добавить ваш процессор в него... Или они настолько радикально разные? Я просто с Rx не сталкивался никогда. cortex r ближе к arm7 чем к cortex-m. у R нет global interrupt controller, и ассемблер отличается. Цитата(Сергей Борщ @ Jan 20 2017, 09:18) Надо искать, откуда это значение туда попадает. Там должен быть указатель на стековый кадр самого приоритетного процесса. я это понимаю и, по идее, Kernel.ProcessTable должна в кострукторе заполняться. меня еще скрипт линковки смущает Код  VECTORS(rx)     : ORIGIN = 0x00000000, LENGTH = 0x00000020   FLASH  (rx)     : ORIGIN = 0x00000020, LENGTH = 0x0013FFE0   CPU_STACK (rw)  : ORIGIN = 0x08000000, LENGTH = 0x00001500 /* Stack is configured in sys_core.asm */   RAM (xrw)       : ORIGIN = 0x08001500, LENGTH = 0x0002EB00   MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K CPU_STACK отдельно идет
  9. Порт Cortex-R4

    Всем доброго дня. Пытаюсь сделать порт для Cortex R4F (чип RM46L852). Компилятор gcc 5.4.1. Использую схему с программным прерыванием. Но возникает проблема в реализации функции os_start По примеру порта ARM7 сделал ассемблерный файл со следующий содержимым (подсматривал в других ОСРВ) Код        .set SYS_MODE,    0x1f         .set SVC_MODE,    0x13         .set IRQ_MODE,    0x12         .set STUB,    0x00         .global context_restore context_restore:     // os_start() passes New_SP in R0     CPS        #SYS_MODE     LDR        R1, [R0]     LDR        SP, [R1]     /* Restore the floating point context, if any. */     POPNE     {R0}     VPOPNE    {D0-D15}     VMSRNE  FPSCR, R0     /* Restore all system mode registers other than the SP (which is already     being used). */     POP        {R0-R12, R14}     /* Return to the task code, loading CPSR on the way. */     RFEIA    sp! в отладчике штатно дохожу до строки КодLDR        R1, [R0] и при ее выполнении процессор улетает в dabort handler. Это означает что инструкция обратилась к данным с которыми проблема. Подскажите пожалуйста в какую сторону начать поиски. у меня подозрение что я что то неверно делаю с заготовкой стека. Кодvoid TBaseProcess::init_stack_frame( stack_item_t * Stack                                    , void (*exec)()                                 #if scmRTOS_DEBUG_ENABLE == 1                                    , stack_item_t * StackBegin                                 #endif                                    ) {         *Stack = ( stack_item_t ) NULL;         Stack--;         *Stack = ( stack_item_t ) NULL;         Stack--;         *Stack = ( stack_item_t ) NULL;         Stack--;         *Stack = ( stack_item_t ) 0x1f;;         if((uintptr_t)exec & (0x01UL))  {                *Stack = *Stack | 0x20;            }         Stack--;         *Stack = reinterpret_cast<stack_item_t>(exec);;         Stack--;         *Stack = ( stack_item_t ) 0;    /* R14 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R12 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R11 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R10 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R9 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R8 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R7 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R6 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R5 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R4 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R3 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R2 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R1 */         Stack--;         *Stack = ( stack_item_t ) 0; /* R0 */         Stack--;         *Stack = ( uint32_t ) 0;         Stack--;         *Stack = ( stack_item_t ) 0; } Это точно не MPU, я его отключал. ADD: в этот момент в R0 содержится значение 0xea006068 , память по этому адресу просмотреть нельзя. Прошу сильно не пинать. Процессор для меня новый.
  10. scmRTOS как POSIX thread

    Цитата(skyspark @ Oct 8 2015, 02:12) Добрый день. Пробовал сделать по аналогии с FreeRTOS под Qt, но с движком WinAPI. Доделать не успел, и сейчас на это нет времени, код могу выложить на bitbutcket. Думаю всем будет интересно
  11. RO rootfs

    Цитата(MikleV @ Jun 3 2015, 16:58) Вы сильно не пинайте просто мне приходиться в данный момент быть "и швец и жнец и на дуде игрец". По большой части со всеми этими кусочками я работал на серверных системах. С embedded немного другая жизнь постоянно приходится к аппаратной части привязываться и к BSP. Я пока собираю под задачи ПО и адаптирую код немного под железку. Следующий этап будет написание CGI прослойки для конфигурирования железяки через WEB (пока начну с примитивных текстовых или строковых конфигов). Ну и последний этап - возможность обновления ПО. По CGI и обновлениям я в режиме накопления информации. C rpm(а именно он идет в составе моей BSP) я попробую поиграться и насколько я представляю пакетные менеджеры они могут работать как с репозиторием так и с отдельными оффлайн пакетами. В этом случае онлайн репозиторий надо городить либо оборачивать пакеты или группы пакетов скачивать их на устройство и потом разбирать.(вот это более реально в смысле оффлайн) Про режимы загрузки: NFS конечно очень удобно но боюсь в моем случае в реальном применении этого не будет (максимум ФТП какой нибудь с конфигами xml ными) nand флешки хорошо дружат с yaffs2. поэтому вы вполне можете иметь три раздела на флешке.
  12. scmRTOS как POSIX thread

    Цитата(Сергей Борщ @ Jun 3 2015, 13:00) Я тоже. При этом хотелось бы, чтобы собиралось и под вин и под лин. mingw ест линуховые исходники хорошо. Думаю это не будет проблемой. но вот за виндовое время реакции я не уверен.
  13. scmRTOS как POSIX thread

    Цитата(AHTOXA @ Jun 3 2015, 11:23) ИМХО: Отладить на ПК какой-то вычислительный алгоритм - это запросто, но для этого не нужны потоки оси и их взаимодействие. А отладка взаимодействия процессов оси на ПК не имеет смысла, потому что для этого уже всяко нужна периферия и её прерывания. Поэтому думаю, что портировать ось на ПК не имеет смысла. Разве что писать потом программы для ПК. Кстати, периодически при написании программ для ПК ловлю себя на мысли, что "вот здесь было бы удобнее с использованием механизмов scmrRTOS" В портировании и я не вижу смысла. А вот отладить межпроцессное взаимодействие в рамках проекта, а самое главное сэмулировать работу устройства (JTAG/SWD не берем в рассчет) было бы удобно. Эмуляцию прерываний я вижу реализуемой через POSIX timers, так же как и SysTick. В этом случае мы можем "более менее" выставить временнЫе соотношения.
  14. scmRTOS как POSIX thread

    Добрый день. я вновь вернулся на форум после нескольких лет написания диссертации Пришла мне в голову идея что не плохо бы для отладки поведения прошивки МК эмулировать алгоритм внутри приложения ББ. Собственно от этого возник вопрос не пытался ли кто нибудь запустить scmRTOS как POSIX процесс? И если нет, хотелось бы спросить у разработчиков считают ли они такую работу перспективной? Может ли она быть полезной кому то кроме меня?
  15. scmRTOS+usb-device

    Передачу запустил, пока правда не понял как. Осталось разобраться с приемом, DataRx почему то не вызывается. Прикладываю проект с продвижениями. [attachment=73122:usb.tar.gz]