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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> HardFault handler M0
toweroff
сообщение Feb 15 2017, 20:08
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Вот такая вот возникла потребность...
для M3 есть, когда-то давно был сделан, но для M0 не подходит
Хоть посмотреть, откуда вылетели...
Смотрел тырнеты всякие, только что-то оформленное для того же M3 и M4

Есть что-то простое, хоть PC посмотреть
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 15 2017, 20:24
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Если совсем простое:
CODE
void HardFault_Handler(void)
{
    volatile int i = 0;
    while(!i)
       ;
}

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 15 2017, 20:59
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Сергей Борщ @ Feb 15 2017, 23:24) *
Если совсем простое:

ого...

Код
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) {


и как понимать эту обработку семафора?
Go to the top of the page
 
+Quote Post
firew0rker
сообщение Feb 16 2017, 01:47
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 11-07-12
Из: Новосибирск
Пользователь №: 72 716



Посмотрите значение указателя p_CB.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 16 2017, 06:34
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(firew0rker @ Feb 16 2017, 04:47) *
Посмотрите значение указателя p_CB.

0x00000001
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 16 2017, 07:55
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (toweroff @ Feb 16 2017, 08:34) *
0x00000001
И что вы ожидатете получить с таким указателем? Мало того, что он указывает на вектора прерываний, так еще и невыровнен (из-за этого и исключение). В общем ищите, откуда в него попадает такое дивное число.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 16 2017, 08:57
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(toweroff @ Feb 15 2017, 23:59) *
ого...

Код
/*!****************************************************************************
  @author    ViKo
  @brief    Simple HardFault Handler
  @details    В пошаговом режиме переставить программный счетчик, выйти,
            PC будет содержать команду, следующую за вызвавшей сбой
  */
__asm void HardFault_Handler(void)
{
  B .        ; бесконечный цикл
  BX LR        ; установить программный счетчик сюда
}
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 16 2017, 09:21
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Сергей Борщ @ Feb 16 2017, 10:55) *
В общем ищите, откуда в него попадает такое дивное число.

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

Кстати, попутно вот такой вопрос:
Есть функция, через которую в юарт валится отладочная информация. Вызывать может кто угодно. Чем ее правильнее закрывать, бинарным семафором или мьютексом? По сути тоже самое
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 16 2017, 12:52
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



В общем докопался. Из прерывания отправлялся сигнал задаче, ID которой был нарушен
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Feb 16 2017, 16:15
Сообщение #10


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

Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094



Цитата(toweroff @ Feb 16 2017, 12:21) *
Есть функция, через которую в юарт валится отладочная информация. Вызывать может кто угодно. Чем ее правильнее закрывать, бинарным семафором или мьютексом?


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

Цитата(toweroff @ Feb 16 2017, 12:21) *
По сути тоже самое


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

Сообщение отредактировал ohmjke - Feb 16 2017, 16:17
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 17 2017, 15:32
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(ohmjke @ Feb 16 2017, 19:15) *


Цитата
(A mutex is really a semaphore with value 1.)

и как это противоречит моему бинарному семафору?
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Feb 17 2017, 18:49
Сообщение #12


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

Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094



Там помимо этого сообщения есть много других, где объясняется, почему это не одно и то же.
Даже к этому сообщению есть комментарии:
Цитата
... 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.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 17 2017, 20:11
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(ohmjke @ Feb 17 2017, 21:49) *
Там помимо этого сообщения есть много других, где объясняется, почему это не одно и то же.
Даже к этому сообщению есть комментарии:

еще раз. Семафор с числом вхождений 1. Кто схватил - тот и пользуется, пока не освободит. Кто и как его может нарушить?
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Feb 17 2017, 21:19
Сообщение #14


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

Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094



Цитата(toweroff @ Feb 17 2017, 23:11) *
еще раз. Семафор с числом вхождений 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 - Feb 17 2017, 21:30
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 18 2017, 19:18
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



У меня лыжи, наверное, не едут. Если у семафора "ключей" > 1, то оно да, один поток может освободить, другой взять освободивщийся "ключ"
Но когда ключ один, его освободит только тот, кто занял. И пока ключ занят, никто другой не войдет...
Хотя, где-то тоже читал, что для reentrant функций правильно использовать мьютекс... Хрен поймешь их.
По сути, у меня с мьютексами работает, но прояснить на будущее сей момент не помешает точно
Go to the top of the page
 
+Quote Post

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

 


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


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