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

Вот такая вот возникла потребность...

для M3 есть, когда-то давно был сделан, но для M0 не подходит

Хоть посмотреть, откуда вылетели...

Смотрел тырнеты всякие, только что-то оформленное для того же M3 и M4

 

Есть что-то простое, хоть PC посмотреть

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


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

Если совсем простое:

void HardFault_Handler(void)
{
    volatile int i = 0;
    while(!i)
       ;
}

В отладчике меняем i, выходим из обработчика в точку возникновения исключения.

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


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

Если совсем простое:

ого...

 

void rt_sem_psh (P_SCB p_CB) {
  /* Check if task has to be waken up */
  P_TCB p_TCB;

  if (p_CB->p_lnk != NULL) {
    /* A task is waiting for token */
    p_TCB = rt_get_first ((P_XCB)p_CB);
    rt_rmv_dly (p_TCB);
    p_TCB->state   = READY;
    p_TCB->ret_val = OS_R_SEM;
    rt_put_prio (&os_rdy, p_TCB);
  }
  else {
    /* Store token */
    p_CB->tokens++;
  }
}

 

вылет тут

  if (p_CB->p_lnk != NULL) {

 

и как понимать эту обработку семафора?

 

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


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

0x00000001
И что вы ожидатете получить с таким указателем? Мало того, что он указывает на вектора прерываний, так еще и невыровнен (из-за этого и исключение). В общем ищите, откуда в него попадает такое дивное число.

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


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

ого...

/*!****************************************************************************
  @author    ViKo
  @brief    Simple HardFault Handler
  @details    В пошаговом режиме переставить программный счетчик, выйти,
            PC будет содержать команду, следующую за вызвавшей сбой
  */
__asm void HardFault_Handler(void)
{
  B .        ; бесконечный цикл
  BX LR        ; установить программный счетчик сюда 
}

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


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

В общем ищите, откуда в него попадает такое дивное число.

Интересно, что вызов этой функции происходит один раз, но сразу в яблочко

 

Кстати, попутно вот такой вопрос:

Есть функция, через которую в юарт валится отладочная информация. Вызывать может кто угодно. Чем ее правильнее закрывать, бинарным семафором или мьютексом? По сути тоже самое

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


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

В общем докопался. Из прерывания отправлялся сигнал задаче, ID которой был нарушен

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


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

Есть функция, через которую в юарт валится отладочная информация. Вызывать может кто угодно. Чем ее правильнее закрывать, бинарным семафором или мьютексом?

 

Для безопасного доступа к разделяемым ресурсам используются мьютексы.

 

По сути тоже самое

 

Не похоже - https://stackoverflow.com/questions/62814/d...phore-and-mutex

Изменено пользователем ohmjke

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


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

 

(A mutex is really a semaphore with value 1.)

и как это противоречит моему бинарному семафору?

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


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

Там помимо этого сообщения есть много других, где объясняется, почему это не одно и то же.

Даже к этому сообщению есть комментарии:

... but this is regarding mutex vs counting semaphore. The question was asked about binary. – Roman Nikitchenko Nov 10 '09 at 7:47

14

 

While what is said by david is correct, but it is NOT the answer to the question asked. Mladen Jankovic answer is the answer to the question asked, where point is made to differentiate "binary-semaphore" vs "mutex". – Ajeet Ganga Aug 21 '11 at 15:45

8

 

Unfortunately, this incorrect answer has more votes than the best answer by @Benoit

 

@JacobRitchie the problem is with the statement that says "A mutex is really a semaphore with value 1" but that is not the case. ThreadA and only ThreadA can increment (and hence release) the mutex that it decremented whereas ThreadB can increment the binSemaphore decremented by ThreadA, which also happens to be the answer to the question in question.

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


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

Там помимо этого сообщения есть много других, где объясняется, почему это не одно и то же.

Даже к этому сообщению есть комментарии:

еще раз. Семафор с числом вхождений 1. Кто схватил - тот и пользуется, пока не освободит. Кто и как его может нарушить?

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


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

еще раз. Семафор с числом вхождений 1. Кто схватил - тот и пользуется, пока не освободит. Кто и как его может нарушить?

 

Что же не ясно?

Note that with a binary semaphore, it is OK for B to take the semaphore and A to give it.

 

Даже в википедии написано:

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

 

Это если говорить о всем том, что пишут в данном случае.

А вообще, у меня сложилось впечатление, что каждый разработчик ОС вкладывает свой смысл в понятие бинарного семафора.

К примеру, из описания мьютексов в TNKernel (http://www.pic24.ru/doku.php/tnkernel/ref/mutex/intro):

Мютекс представляет собой двоичный семафор с дополнительными свойствами (например, протоколы обхода неограниченной инверсии приоритетов).
Изменено пользователем ohmjke

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


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

У меня лыжи, наверное, не едут. Если у семафора "ключей" > 1, то оно да, один поток может освободить, другой взять освободивщийся "ключ"

Но когда ключ один, его освободит только тот, кто занял. И пока ключ занят, никто другой не войдет...

Хотя, где-то тоже читал, что для reentrant функций правильно использовать мьютекс... Хрен поймешь их.

По сути, у меня с мьютексами работает, но прояснить на будущее сей момент не помешает точно

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


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

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

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

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

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

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

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

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

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

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