реклама на сайте
подробности

 
 
> опять про оптимизацию :( глюк нашел вроде
sergik_vrn
сообщение Feb 4 2009, 11:52
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



во время выполнения FreeRTOS непонятным образом сами собой запрещались прерывания. Путем несложной трассировки выяснил, что происходят они при парном вызове vPortEnterCritical() - vPortExitCritical(), по принципу
Код
portTickType xTaskGetTickCount( void )
{
portTickType xTicks;

    /* Critical section required if running on a 16 bit processor. */
    taskENTER_CRITICAL();
    {
        xTicks = xTickCount;
    }
    taskEXIT_CRITICAL();

    return xTicks;
}

сами процедуры с виду простейшие
Код
void vPortEnterCritical( void )
{
    /* Disable interrupts first! */
    __disable_interrupt();

    /* Now interrupts are disabled ulCriticalNesting can be accessed
    directly.  Increment ulCriticalNesting to keep a count of how many times
    portENTER_CRITICAL() has been called. */
    ulCriticalNesting++;
}
/*-----------------------------------------------------------*/
void vPortExitCritical( void )
{
    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
    {
        /* Decrement the nesting count as we are leaving a critical section. */
        ulCriticalNesting--;

        /* If the nesting level has reached zero then interrupts should be
        re-enabled. */
        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
        {
            __enable_interrupt();
        }
    }
}

portNO_CRITICAL_NESTING разумеется = 0


однако, что я получаю при трасировке:
Код
??vPortPreemptiveTick_0:
  00017E5C  004000E0  DC32         0xE0004000
__disable_interrupt();
vPortEnterCritical:
vPortEnterCritical:
  00017E60  E10F0000  MRS          R0, CPSR
  00017E64  E38000C0  ORR          R0, R0, #0xC0
  00017E68  E121F000  MSR          CPSR_c, R0
ulCriticalNesting++;
  00017E6C  E59F003C  LDR          R0, [PC, #+60]          ; [??DataTable1 (0x17EB0)] =ulCriticalNesting (0x4000F3B8)
  00017E70  E5901000  LDR          R1, [R0, #+0]
  00017E74  E2811001  ADD          R1, R1, #0x1

до этого момента все выполняется как надо, адрес в R0, правильное значение в R1

*pxTopOfStack = portNO_CRITICAL_NESTING;
Next label is a Thumb label
?Subroutine0:
.text_19:
  00017E78  6001      STR          R1, [R0, #0]

не имеет никакого эффекта, значение не обновляется

return pxTopOfStack;
  00017E7A  4770      BX           LR

не выполняется вообще
соттветственно, дальше выполняется vPortExitCritical:

if( ulCriticalNesting > portNO_CRITICAL_NESTING )
vPortExitCritical:
vPortExitCritical:
  00017E7C  E59F002C  LDR          R0, [PC, #+44]          ; [??DataTable1 (0x17EB0)] =ulCriticalNesting (0x4000F3B8)
  00017E80  E5901000  LDR          R1, [R0, #+0]
  00017E84  E3510000  CMP          R1, #0x0

поскольку значение ulCriticalNesting не было инкрементировано, проверка отрицательная, дальше выход

  00017E88  0A000007  BEQ          ??vPortExitCritical_0   ; 0x17EAC


  ulCriticalNesting--;
  00017E8C  E5901000  LDR          R1, [R0, #+0]
  00017E90  E2411001  SUB          R1, R1, #0x1
  00017E94  E5801000  STR          R1, [R0, #+0]
  if( ulCriticalNesting == portNO_CRITICAL_NESTING )
  00017E98  E5900000  LDR          R0, [R0, #+0]
  00017E9C  E3500000  CMP          R0, #0x0
   __enable_interrupt();
  00017EA0  010F0000  MRSEQ        R0, CPSR
  00017EA4  03C000C0  BICEQ        R0, R0, #0xC0
  00017EA8  0121F000  MSREQ        CPSR_c, R0
}
??vPortExitCritical_0:
  00017EAC  E12FFF1E  BX           LR

...


итог - после выхода из vPortEnterCritical значение ulCriticalNesting нулевое, прерывания запрещены, вызов vPortExitCritical не имеет значения. При уменьшении уровня оптимизации все нормализуется. volatile не влияет на исполнение. Поскольку я в ассемблере мягко говоря не силен, одолеть эту задачку мне оказалось не по зубам
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение Feb 4 2009, 15:58
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
проект здоровый, в самом большом варианте еле-еле помещается в ПЗУ контроллера


Возьмите следующий камень в линейке. Тем более, что цены на LPC более чем демократичны. Или 2478 - самый здоровый по Flash? Если да, то предлагаю такой способ. Указываете High Speed и руками для каждого файла выбираете ARM или Thumb. Причем, операционку очень желательно в ARM-режиме собирать, веселее будет. А дальше смотреть по месту.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Feb 5 2009, 08:02
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(Rst7 @ Feb 4 2009, 18:58) *
Возьмите следующий камень в линейке. Тем более, что цены на LPC более чем демократичны. Или 2478 - самый здоровый по Flash? Если да, то предлагаю такой способ. Указываете High Speed и руками для каждого файла выбираете ARM или Thumb. Причем, операционку очень желательно в ARM-режиме собирать, веселее будет. А дальше смотреть по месту.

сами понимаете, просто так "взять следующий камень" не так просто, как хотелось бы, при серийном производстве. впрочем, 2478 тьфу-тьфу пока по этим параметрам не напрягает, речь была про STR710, а он-таки самый жирный в линейке.
насчет предложенного способа - спасибо, попробую, как только образуется дыра в расписании. щас вот бьюсь, в другом месте вылезли глюки в многократно отлаженном на разных процессорах коде sad.gif уже подумываю откатиться на 4.41 sad.gif
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Feb 5 2009, 10:08
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(sergik_vrn @ Feb 5 2009, 11:02) *
сами понимаете, просто так "взять следующий камень" не так просто, как хотелось бы, при серийном производстве. впрочем, 2478 тьфу-тьфу пока по этим параметрам не напрягает, речь была про STR710, а он-таки самый жирный в линейке.
насчет предложенного способа - спасибо, попробую, как только образуется дыра в расписании. щас вот бьюсь, в другом месте вылезли глюки в многократно отлаженном на разных процессорах коде sad.gif уже подумываю откатиться на 4.41 sad.gif

попробовал собрать проект с оптимизацией по скорости. размер вырос со 130К до 170К, глюки с data_abort в отлаженном коде пропали. Пока работаю так, дальше посмотрим
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Feb 12 2009, 11:40
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



очередной глюк с data abort в отлаженном коде, при вызове виртуального метода. на этот раз с оптимизацией по скорости. полдня убил, лечится, как обычно, снижением уровня оптимизации в конкретной функции. Чувствую, откачусь я на 4.41, мне такие сюрпризы все нервы съедят sad.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sergik_vrn   опять про оптимизацию :( глюк нашел вроде   Feb 4 2009, 11:52
- - aaarrr   Цитата(sergik_vrn @ Feb 4 2009, 14:52) По...   Feb 4 2009, 11:56
|- - sergik_vrn   Цитата(aaarrr @ Feb 4 2009, 14:56) Не зам...   Feb 4 2009, 12:51
- - Rst7   Жестко... А посмотрите в листинг, где еще встречае...   Feb 4 2009, 12:57
|- - sergik_vrn   Цитата(Rst7 @ Feb 4 2009, 15:57) Жестко.....   Feb 4 2009, 13:09
- - Rst7   Посмотрел. А что, у нас нынче IAR сам выбирает, ка...   Feb 4 2009, 13:37
|- - sergik_vrn   Цитата(Rst7 @ Feb 4 2009, 16:37) Посмотре...   Feb 4 2009, 15:15
|- - Andy Mozzhevilov   Цитата(Rst7 @ Feb 4 2009, 19:37) Посмотре...   Feb 15 2009, 11:04
- - Rst7   Цитатапока что влепил #pragma optimize = medium дл...   Feb 4 2009, 15:33
|- - sergik_vrn   Цитата(Rst7 @ Feb 4 2009, 18:33) Поставил...   Feb 4 2009, 15:40
- - Andy Mozzhevilov   Цитата(sergik_vrn @ Feb 12 2009, 17:40) о...   Feb 15 2009, 09:48


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01424 секунд с 7
ELECTRONIX ©2004-2016