Jump to content

    
Sign in to follow this  
SMRM

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

Recommended Posts

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

Пишу проект на 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.

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

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

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

Edited by IgorKossak
[codebox] для длинного кода, [code] - для короткого

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this