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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
dxp
сообщение Oct 9 2015, 02:42
Сообщение #16


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Спасибо за листинг!

QUOTE (skyspark @ Oct 9 2015, 08:03) *
Глянул дизасмом:

Вариант без volatile (нерабочий):
CODE
08002206:   beq.n 0x8002220 <OS::TKernel::sched()+40>
84               SchedProcPriority = NextPrty;
>0800220a:   str r2, [r0, #12]
90                   DUMMY_INSTR();
>08002216:   nop
93               while(CurProcPriority != SchedProcPriority); // until context switch done
>0800221a:   ldr r3, [r0, #0]
87               do
>0800221c:   cmp r3, r2
0800221e:   bne.n 0x8002214 <OS::TKernel::sched()+28>

Загрузка SchedProcPriority производится в регистр r2 до nop, но перед сравнением этого не делается, а делаться должно, потому что SchedProcPriority - volatile. Посмотрите, пожалуйста, объявлена ли эта переменная у вас волатильной? И какая версия оси используется?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 9 2015, 04:41
Сообщение #17


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(skyspark @ Oct 9 2015, 07:03) *
Вариант без volatile (нерабочий):
Код
08002206:   beq.n 0x8002220 <OS::TKernel::sched()+40>
84               SchedProcPriority = NextPrty;
>0800220a:   str r2, [r0, #12]
90                   DUMMY_INSTR();
>08002216:   nop
93               while(CurProcPriority != SchedProcPriority); // until context switch done
>0800221a:   ldr r3, [r0, #0]
87               do
>0800221c:   cmp r3, r2
0800221e:   bne.n 0x8002214 <OS::TKernel::sched()+28>

Хм.
[r0, #12] - это SchedProcPriority
[r0, #0] - это CurProcPriority

У вас здесь похоже, всё наоборот: CurProcPriority - volatile (перечитывается перед сравнением), а SchedProcPriority - нет.
Наверное, вы для проверки убирали volatile, и убрали немного не тамsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
skyspark
сообщение Oct 16 2015, 16:24
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-02-08
Пользователь №: 35 238



Цитата(AHTOXA @ Oct 9 2015, 07:41) *
Хм.
[r0, #12] - это SchedProcPriority
[r0, #0] - это CurProcPriority

У вас здесь похоже, всё наоборот: CurProcPriority - volatile (перечитывается перед сравнением), а SchedProcPriority - нет.
Наверное, вы для проверки убирали volatile, и убрали немного не тамsm.gif


Вот только добрался снова до этого кода. Да, по всей видимости ошибся (уж под утро дело было), но эффект был такой же как и ранее.
Пробежался по истории репозитория увидел, что потребовалось еще одно изменение

CODE
INLINE static volatile uint_fast8_t & cur_proc_priority() { return Kernel.CurProcPriority; }


Ну без этого "строгие" ++-ы валили ошибку.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 16 2015, 16:52
Сообщение #19


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Эх, мы так не разберёмся. На вопросы о версии компилятора вы не отвечаете, ось используете со своими правками.

Давайте попробуем по порядку.

Попробуйте взять оригинальную версию оси, прямо из транка. Или вот временное зеркало версии для Cortex-Mx на гитхабе.
Если ошибка повторится - давайте сюда версию компилятора, ключи компиляции и листинг проблемного места.
Если нет - напишите тоже, мы все выдохнем и разойдёмсяsm.gif

PS. Чтобы узнать версию компилятора, наберите arm-none-eabi-gcc --version в командной строке.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
skyspark
сообщение Oct 17 2015, 00:18
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-02-08
Пользователь №: 35 238



Цитата(AHTOXA @ Oct 16 2015, 19:52) *
Если нет - напишите тоже, мы все выдохнем и разойдёмсяsm.gif


Выдыхаем, спасибо. Совладал.

Проблемы обнаружилось две:
1. если собирать внешним make-ом получается не понятно что и виснет где и раньше. Переключился на internal стало интересно.
2. если отлаживаться st-util'ом виснет как и раньше, но после аппаратного сброса (без разрыва debug-сессии) работает правильно. Разобрался с настройками родного opencdt и с ним все стало хорошо.

на всякий случай версия компилера (http://www.openstm32.org): arm-none-eabi-gcc.EXE (GNU Tools for ARM Embedded Processors) 4.9.3 20150529 (release) [ARM/embedded-4_9-branch revision 224288]

P.S. Извините за беспокойство rolleyes.gif
Go to the top of the page
 
+Quote Post

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

 


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


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