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

 
 
> Критическия секция, оцените и выскажите своё мнение
xelax
сообщение Dec 12 2007, 12:13
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



sam7x + arm-elf-gcc
Решил этот вопрос вынести в отдельную тему.
По совету Сергея Борща переделал критические секция из FreeRTOS для себя.

Так как переделовать пришлось код на асме, а в асме я позорно слаб, поэтому просьба покритиковать если что.

На какие вещи опирался.
Сделал дизасм своего проекта и увидел, что переменная переданная в функцию в конечном счёте оказывается в R0 до выполнения кода функции. Поэтому значение CSPR регистра я сохраняю и соответсвенно восстанавливаю по адресу хранящемуся в R0.

И ещё меня смущает одна вещь, собрал проект с оптимизацией -Os. Естественно никакой передачи параметров в функцию нет, но указатель на переменную всё равно оказался в R0 smile.gif
Но в тоже время я вижу что SP и R0 имеют всегда одинаковое значение до начала выполнения тела функции.

Верно ли моё наблюдение про R0. И если верно ли оно для оптимизированного кода.

хидерник
Код
typedef  uint32_t atomic_t;

void StartAtomic(atomic_t volatile *pAtomic);

void EndAtomic(atomic_t volatile *pAtomic);

#define ATOMIC_SECTION_ENTER  {volatile atomic_t __atomic; StartAtomic(&__atomic);
#define ATOMIC_SECTION_LEAVE  EndAtomic(&__atomic);}


сишник
Код
void StartAtomic(atomic_t volatile *pAtomic)
{  

  /* Disable interrupts as per portDISABLE_INTERRUPTS();                             */
    asm volatile (
        "STMDB    SP!, {R1}            \n\t"    /* Push R1.                                */
        "MRS    R1, CPSR            \n\t"    /* Get CPSR.                            */
        "STR    R1, [R0]                          \n\t"
        "ORR    R1, R1, #0xC0             \n\t"    /* Disable IRQ, FIQ.                    */
        "MSR    CPSR, R1            \n\t"    /* Write back modified value.            */
        "LDMIA    SP!, {R1}" );                /* Pop R1.                                */
}

void EndAtomic(atomic_t volatile *pAtomic)
{
  asm volatile (
                "STMDB    SP!, {R1}        \n\t"    /* Push R1.                        */    
                "LDR    R1, [R0]                   \n\t"                        
                "MSR    CPSR, R1        \n\t"    /* Write back modified value.    */    
                "LDMIA    SP!, {R1}" );            /* Pop R1.                        */
}


З.Ы. Работает уже почти час. Пока живёт. 05.gif

Сообщение отредактировал xelax - Dec 12 2007, 12:15
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 01:26
Рейтинг@Mail.ru


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