Перейти к содержанию
    

VladislavS

Свой
  • Постов

    1 240
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные VladislavS


  1. Это же Cortex-M7, если я правильно помню? Не думаю что у него такое возможно. Вы же видели, что ваш код, состоящий из последовательных STR разных регистров даёт 2 такта. Со STR выше не прыгнешь.

     

    Еще у вашего процессора fpu есть, там тоже хранить что-то можно.

  2. Сделать чтобы компилятор оптимизировал как-то гарантировано невозможно.  Нужен асм. Функцию на асме проще всего начать написав её на С, скомпилировать её и вытащить листинг. В этом листинге будет вся "обязательная обвязка". Внутренности правьте как надо.

    И всё же, при наличии много памяти, я бы на DMA попробовал. Скорее всего получите ту же скорость, но сильно проще алгоритмически.

  3. Ваш код действительно даст 2 такта на запись, но сколько будет стоит подготовка к этой записи? Сомневаюсь, что вам 256 раз надо одно и то же выводить.

            SECTION `.text`:CODE:NOROOT(2)
            THUMB
    //    7 void RunRealExcitationOne()
    //    8 { unsigned int  A0=0x22a20002;
    _Z20RunRealExcitationOnev:
            PUSH     {R4-R11,LR}    
    //    9   unsigned int  A1=0x22860002;
    //   10   unsigned int  A2=0x2a840002;
    //   11   unsigned int  A3=0x0a940002;
    //   12   unsigned int  A4=0x0a150002;
    //   13   unsigned int  A5=0x18150002;
    //   14   unsigned int  A6=0x18510002;
    //   15   unsigned int  A7=0x11510002;
    //   16   unsigned int  A8=0x11490002;
    //   17   unsigned int  A9=0x15480002;
    //   18   unsigned int A10=0x05680002;
    //   19   unsigned int A11=0x052a0002;
    //   20   unsigned int A12=0x242a0002;
    //   21   unsigned int A13=0x24a20002;
    //   22   unsigned char i=255;
            LDR.N    R1,??DataTable3
            LDR.N    R2,??DataTable3_1
            LDR      R1,[R1, #+4]   
            LDR.N    R3,??DataTable3_2
            LDR.N    R4,??DataTable3_3
            LDR.N    R5,??DataTable3_4
            LDR.N    R6,??DataTable3_5
            LDR.W    R11,??DataTable3_6
            LDR.W    R12,??DataTable3_7
            LDR.W    LR,??DataTable3_8
            LDR.W    R8,??DataTable3_9
            LDR.W    R9,??DataTable3_10
            LDR.W    R10,??DataTable3_11
            MOVS     R0,#+255       
    //   23   do
    //   24   { *GPIO6=A0;
    ??RunRealExcitationOne_0:
            STR      R10,[R1, #+0]  
    //   25     *GPIO6=A1;
            STR      R9,[R1, #+0]   
    //   26     *GPIO6=A2;
            STR      R8,[R1, #+0]   
    //   27     *GPIO6=A3;
            STR      LR,[R1, #+0]   
    //   28     *GPIO6=A4;
            STR      R12,[R1, #+0]  
    //   29     *GPIO6=A5;
            STR      R11,[R1, #+0]  
    //   30     *GPIO6=A6;
            STR      R6,[R1, #+0]   
    //   31     *GPIO6=A7;
            STR      R5,[R1, #+0]   
    //   32     *GPIO6=A8;
            STR      R4,[R1, #+0]   
    //   33     *GPIO6=A9;
            STR      R3,[R1, #+0]   
    //   34     *GPIO6=A10;
            STR      R2,[R1, #+0]   
    //   35     *GPIO6=A11;
    //   36     *GPIO6=A12;
    //   37     *GPIO6=A13;
    //   38     i--;
    //   39   } while(i);
            SUBS     R0,R0,#+1      
            LDR.N    R7,??DataTable3_12
            STR      R7,[R1, #+0]   
            LDR.N    R7,??DataTable3_13
            STR      R7,[R1, #+0]   
            LDR.N    R7,??DataTable3_14
            STR      R7,[R1, #+0]   
            BNE.N    ??RunRealExcitationOne_0
    //   40 }
            POP      {R4-R11,PC}  

    Регистров таки не хватило

  4. Вот смотрите. 

    constexpr uint32_t buf[]  =
    { 0x22a20002, 0x22860002, 0x2a840002, 0x0a940002,
      0x0a150002, 0x18150002, 0x18510002, 0x11510002,
      0x11490002, 0x15480002, 0x05680002, 0x052a0002,
      0x242a0002, 0x24a20002 };
    
    // У меня нет такого контроллера, адрес порта пальцем в небо
    volatile uint32_t *GPIO6 = (uint32_t *)0x1000'0000;
    
    void foo()
    {
      *GPIO6 = buf[0];
      *GPIO6 = buf[1];
      *GPIO6 = buf[2];
      *GPIO6 = buf[3];
      *GPIO6 = buf[4];
      *GPIO6 = buf[5];
      *GPIO6 = buf[6];
      *GPIO6 = buf[7];
      *GPIO6 = buf[8];
      *GPIO6 = buf[9];
      *GPIO6 = buf[10];
      *GPIO6 = buf[11];
      *GPIO6 = buf[12];
      *GPIO6 = buf[13];
    }

    И в лучшем случае, вы можете надеяться, что копилятор это оптимизирует вот так

    //foo();
            LDR.N    R1,??DataTable2
            LDR      R0,[R1, #+4]   
            LDR.N    R2,??DataTable2_1
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_2
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_3
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_4
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_5
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_6
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_7
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_8
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_9
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_10
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_11
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_12
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_13
            STR      R2,[R0, #+0]   
            LDR.N    R2,??DataTable2_14
            STR      R2,[R0, #+0] 

    Понятно, что никакого одного такта на запись тут не может быть. Смотрите в сторону DMA.

  5. Надеюсь, вы понимаете, что запись числа в порт просходит через загрузку адреса порта в регистр процессора, загрузки числа в другой регистр процессора, пересылка данных в порт командой STR. И каждая из этих составляющих выпол6яется далеко не один такт.

     

    Максимум, что вы можете сделать, завести массив констант и из него в порт последоаательно элементы писать. Тогда код оптисизируется до последовательности LDR, STR, LDR, STR. Ещё можно переслать с помощтю DMA, если контроллер умеет.

  6. 2 часа назад, KoGIch сказал:

    но я не могу рассказать накой мне сдались эти нули. Просто поверьте эти нули там нужны.

    Всё больше убеждаюсь, что они там даром не нужны. Скорее всего, между данными есть промежутки. В бинарнике эти места забиты нулями, ибо нет механизма сделать в нём дырки. А в хексе их просто не пишут. Вам же советовали map-файл смотреть. Присоединяюсь к совету.

     

    2 часа назад, KoGIch сказал:

    Если можете помогите разобраться где прописаны правила сборки при отладке

    Извини, с VS Code не работаю. 

  7. Вы не то лечить пытаетесь. Лучше объясните зачем в бинарнике, эльфе или хексе вам нули понадобились? Иницализация нулями секций данных, предполагающих такую инициализацию, происходит при старте контроллера в стартапе. Придумать зачем пихать секции с нулями во флэшь с ходу не получается.

  8. 20 минут назад, Vladimir_T сказал:

    1. Будут ли корректно работать на ПК две среды MDK Keil (4.70 и 5.20)? Это нужно, чтобы и прежний проект поддерживать (для 405-го).

    2. MDK Keil 5.20 будет компилировать проект версии 4.70? В проекте используются только стандартные библиотеки CMSIS. 

    Скорее всего, обе версии будут работать. Но я бы не плодил зоопарк и собрал всё в новом Keil.

    22 минуты назад, Vladimir_T сказал:

    3. Если проект хорошо отлажен и работает на 405-м будет ли он нормально работать на 722-м?

    Не будет никак работать.

  9. 1 час назад, Eddy_Em сказал:

    народ гоняет туда-сюда всякие непонятные структуры, пишет дикие портянки кода…

    Чем вам структуры не угодили? Они заполняются константными данными, оптимизатор с ними разбирается на раз два. Пример

    struct PORTS 
    {
      uint32_t port_a;
      uint32_t port_b;
      uint32_t port_c;
    };
    
    void foo(PORTS *ports)
    {
      if(ports->port_a > 10) GPIOA->ODR = ports->port_a;
      if(ports->port_b < 10) GPIOB->ODR = ports->port_b;
      GPIOC->ODR = ports->port_c;
      
    }
    
    int main()
    {       
      PORTS x;
      x.port_a = 0;
      x.port_b = 1;
      x.port_c = 2;
      foo(&x);  
    }

    Листинг

    //   22   PORTS x;
    //   23   x.port_a = 0;
    //   24   x.port_b = 1;
    //   25   x.port_c = 2;
    //   26   foo(&x);  
            MOVS     R0,#+1         
            LDR      R1,??main_0    
            STR      R0,[R1, #+0]   
            MOVS     R4,#+2         
            LDR      R0,??main_0+0x4
            STR      R4,[R0, #+0]
            
    ??main_0:
            DATA32
            DC32     0x50000414 
            DC32     0x50000814

     

  10. 13 часов назад, MDD сказал:

    Вас сильно удивит, что во времена 4051 было немало "человеков-оркестров"?

    Кто мешает им ещё и прошивать все выпускаемые устройства и никому не давать прошивку?

  11. Над разработкой устроиства трудятся схемотехники, топологи, констукторы, технологи и т.д. И только хитрожопые программисты, даже неспособные защитить прошивку, почему-то хотят "всю жизнь получать гонорар".  Я пониааю, когда голое ПО, которое без защиты больше одного раза не продашь. Но прошивка с каждой железкой продаётся. И програмист имет (или не имет, тут дело труового договора) точно такие же права как остальные разработчики.

×
×
  • Создать...