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

использование TLS в IAR

Здравствуйте, Уважаемые Коллеги!

Пишу проект на LPC1769. Среда IAR 7.3. RTOS - uCOS-III.

Использую STL(vector, list, map и auto_ptr). Необходимо обеспечить потоковую безопастность как библиотечных объектов, так и собственных при размещении в куче(вызов new и delete).

Пытаюсь сделать это через System locks interface IAR.

Подключаю к проекту описание

void __iar_system_Mtxinit(__iar_Rmtx *); /* Initialize a systemlock */
void __iar_system_Mtxdst(__iar_Rmtx *);/*Destroy a system lock */
void __iar_system_Mtxlock(__iar_Rmtx *); /* Lock a system lock */
void __iar_system_Mtxunlock(__iar_Rmtx *); /* Unlock a system lock */

сделанное в TLS OS uCOS-III.

Все компилится. При отладке вижу что __iar_system_Mtxlock при создании динамического объекта вызывается, она далее вызывает

void  OS_TLS_LockAcquire (void  *p_lock)
{
    OS_TLS_LOCK  *p_tls_lock;
    OS_ERR        os_err;    
    
    if ((p_lock    == (void *)0          ) ||                     /* Return if the lock handler is 'NULL' or the ...  */
        (OSRunning != OS_STATE_OS_RUNNING)) {                     /* ... kernel is not running.                       */
        return;
    }
    
    p_tls_lock = (OS_TLS_LOCK *)p_lock;
    OSMutexPend((OS_MUTEX *)&p_tls_lock->Mutex,
                (OS_TICK   ) 0u,
                (OS_OPT    ) OS_OPT_PEND_BLOCKING,
                (CPU_TS   *) 0,
                (OS_ERR   *)&os_err);
    (void)&os_err;
}

но до mutex дело не доходит, так как p_lock = 0 . Соответсвенно защиты нет и как следствие через какое-то время вылет в EXIT.

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

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

Может кто-то сталкивался с такой задачей. Заранее благодарю за помощь.

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а __iar_system_Mtxinit у вас вызывается при инициализации системы? Можете в отладчике это проследить?

И еще, как идея, посмотрите про опцию линкера --threaded_lib

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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