Easyelectronics.ru

Электроника для всех
Текущее время: 24 фев 2018, 17:12

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 107 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 08:24 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 600
Откуда: Челябинск
rmb писал(а):
Вот покопался, нашел IAR. тот же код абсолютно нормально работает. ну и что это было? мне что-то не хочется в IAR'е работать - чет мне он не приглянулся.

Вообще-то, корректно было бы так:
Код:
#define BUFFER_SIZE 10
struct Buffer {
              char array[BUFFER_SIZE] ;
              char stInd;
              char endInd;
              }
bfr;

char pushBuffer(struct Buffer *bp, char Item)
         {
         char  i = bp->stInd;
         if (i >= BUFFER_SIZE)         // Out of range
               return 0;               // then error
         bf->array[bf->stInd++] = Item;
         return 1;                     // OK!
         }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 10:40 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
ну, допустим я тупанул и массив переполнится. ради чистоты эксперимента поправил код... он все равно он не работает. переменная i подсвечивается красненьким и почему-то в "выхлоп" не попадает. при этом компилятор ни на что не ругается. Ткните меня еще разок и покажите что не так? повторюсь: в IAR такого не наблюдается.


Вложения:
Безымянный3.jpg
Безымянный3.jpg [ 173.13 Кб | Просмотров: 730 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 11:07 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 2494
Откуда: Тольятти
От переменной i не зависят ветвления, вот компилятор и выкинул проверку. Зачем, если все равно делать надо все то же самое? Одна строка сразу после while() заставит его сделать проверку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 11:23 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
а можно "разжевать"? попробовал поиграться с параметрами оптимизации. код работает либо без оптимизации либо с оптимизацией для дебага, любая другая оптимизация делает программу не работоспособной.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 11:37 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3434
Откуда: Новосибирск
rmb писал(а):
а можно "разжевать"? попробовал поиграться с параметрами оптимизации. код работает либо без оптимизации либо с оптимизацией для дебага, любая другая оптимизация делает программу не работоспособной.

Короче, вы тупо копируете и пробуете. Нужно понимать что значит каждый знак, который вы пишете в своем коде. У вас в коде логические ошибки. Разбирайтесь. Что вы написали, что вы тупо скопипастили. Подсказка. Ошибка в самой функции и в main.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 11:57 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
заблудился в 3-х соснах...подозреваю, что это не мое(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:03 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3434
Откуда: Новосибирск
rmb писал(а):
заблудился в 3-х соснах...подозреваю, что это не мое(

Ваше дело... Легко сдаетесь? Каюсь, когда начинал, тоже не раз было пораженческое настроение. Бросал. Возвращался снова. На самом деле не так все сложно. В определенный момент поступающая информация превышает критический порог и наступает понимание. Запомните это на будущее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:04 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1075
Откуда: Курск
rmb писал(а):
заблудился в 3-х соснах...подозреваю, что это не мое(

Show Не дрейфь


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:06 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
ну сейчас посижу, посмотрю на одну строку, потуплю в монитор может придет озарение) но пока это выше моего понимания


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:24 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3434
Откуда: Новосибирск
rmb писал(а):
ну сейчас посижу, посмотрю на одну строку, потуплю в монитор может придет озарение) но пока это выше моего понимания

Изучайте материалы. Ищите в инете указатели массивы структуры


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:38 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 600
Откуда: Челябинск
rmb писал(а):
ну сейчас посижу, посмотрю на одну строку, потуплю в монитор может придет озарение) но пока это выше моего понимания

Так исправьте, чтобы работала при любой оптимизации
Код:
   for (i = 0; i < 10; ++i)
        pushBuf(&bfr, i);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:45 
Только пришел

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 28
rmb писал(а):
ну сейчас посижу, посмотрю на одну строку, потуплю в монитор может придет озарение) но пока это выше моего понимания

Очень хорошо помогает прямо на бумажке "выполнять" вашу программу. И начинайте с простого. Зачем сразу в функцию адрес структуры передавать? Можно было просто в цикле for этот массив заполнить. Оптимизацию отключите и сосредоточьтесь на правильности кода. Корректный код оптимизация не испортит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 13:23 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
я согласен. на АСМе я так порой и делал - там все до безобразия понятно - что написал, то и получи. тут как то по-другому


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 14:16 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 174
Цикл 'do ... while()' -- это цикл с постусловием: сначала выполняем, а потом проверяем.
Код:
while(1)
{
   do
   {
      pushBuf(&dfr, 10);
      i++;
   } while (i < 10);
}

  1. Сначала входим в цикл 'while(1)', потом в цикл 'do .. while', цикл 'do ... while' будет крутиться пока 'i < 10'.
  2. После выходим из цикла.
  3. Далее проверка 'while(1)' -- бесконечный цикл.
  4. Далее опять входим в цикл 'do ... while', вызываем 'pushBuf' -- уже с переполнением, увеличиваем i -- становится равно 11 (12, 13, 14 и т.д.) .
  5. Проверяем 'while (i < 10)', 'i' при этом уже 11 -- условие не выполняется выходим из цикла.
  6. Переходим в пункт 3 и далее до бесконечности.
При оптимизации компилятор должен выкинуть 'do ... while' как бесполезный.
Оставить только:
Код:
while(1)
{
   pushBuf(&dfr, 10);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 14:32 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
Спасибо Тебе добрый человек! это довольно показательно и будет мне наукой.
я понял, вся соль в строке: bf->arr[bf->enInd++]=Item;
по моей логике поле enInd должно увеличиваться. по факту элементы массива выбираются правильно, но сама переменная в структуре не меняется - это меня вводит в ступор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 15:00 
Только пришел

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 28
rmb писал(а):
там все до безобразия понятно - что написал, то и получи. тут как то по-другому

Вы не поверите, тут тоже самое - что написал то и получил. Фигню написал - фигню получил. :)

Ну вот, к примеру, Sphynx55 на той странице выкладывал
Код:
char mc_cr_getchar()
{
   switch(mc_cr_src){
      case cr_src_usart:{
         char temp;
         while(MCU_RX_Get(&temp)){
            mc_core_stat = cr_wait ;
            asm("sleep");
            mc_core_stat = cr_busy ;
         }
         if (temp==';')mcu_com_task();
         return temp;
      } break;
      default : {}
   }
}

Ну ведь каша в голове у писавшего это. Уберу шелуху, чтобы было наглядней
Код:
char mc_cr_getchar()
{
  switch(mc_cr_src)
  {
    case cr_src_usart:   
      сhar temp;
      while(MCU_RX_Get(&temp))
      {
        mc_core_stat = cr_wait ;
        asm("sleep");
        mc_core_stat = cr_busy ;
      }
      if (temp==';') mcu_com_task();
      return temp;
  }
}

С ходу вопрос: что вернёт функция, если mc_cr_src чудесным образом не будет равна cr_src_usart? Хорошо было бы mc_cr_src передать параметром в функцию. Да, накладные расходы, но так лучше. Кстати, хорошим тоном будет cr_src_usart написать CR_SRC_USART, чтобы видно было что это не переменная. То же самое с cr_wait и cr_busy.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 15:09 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 2494
Откуда: Тольятти
rmb писал(а):
потуплю в монитор может придет озарение

Делайте как я. За день набираете вопросов. На какие-то удаётся ответить, на какие-то нет. Вечером перед сном акцентируете на тех загадках, решить которые не удалось. И ложитесь спать. Утром просыпаетесь, вспоминаете проблему и вдруг обнаруживаете в голове её готовое решение. Мозг работает всю ночь. Может быть, не так быстро, как днем, но и не совсем бездействует. Но продукцию выдаёт, только если загружены исходные данные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 17:34 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 174
rmb писал(а):
я понял, вся соль в строке: bf->arr[bf->enInd++]=Item;
по моей логике поле enInd должно увеличиваться. по факту элементы массива выбираются правильно, но сама переменная в структуре не меняется - это меня вводит в ступор.

Не знаю как код выглядит сейчас, но судя по скриншоту (вкладка с дизассемблированным кодом) в массив 'arr[10]' укладывается число '10' в позицию, задаваемую значением поля 'enInd', затем поле 'enInd' инкрементируется (правда в качестве памяти, хранящей значение поля 'enInd' используется регистр R24 и значение этого регистра обратно в память не сохраняется, т.к. компилятор так с оптимизировал код. А сделал он так потому, что нет такой необходимости в соответствии с логикой Си-шной программы -- поле 'enInd' больше ни где не используется, поэтому зачем тратить время на сохранение его значения обратно в память из регистра R24.). Чтобы значение поля 'enInd' поменялось в памяти нужно в Си-шном коде далее каким-то образом это значение использовать (при чём так, чтобы компилятор опять не "соптимизировал").


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 17:37 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 174
iev91 писал(а):
rmb писал(а):
потуплю в монитор может придет озарение

Делайте как я. За день набираете вопросов. На какие-то удаётся ответить, на какие-то нет. Вечером перед сном акцентируете на тех загадках, решить которые не удалось. И ложитесь спать. Утром просыпаетесь, вспоминаете проблему и вдруг обнаруживаете в голове её готовое решение. Мозг работает всю ночь. Может быть, не так быстро, как днем, но и не совсем бездействует. Но продукцию выдаёт, только если загружены исходные данные.

Рабочий метод.
Бывает бьёшься над решением несколько дней, а потом с утра под душем -- "Б**, вот же оно - решение-то!!!".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 20:21 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Show

Почему каша, мне кажется все понятно, и ничего лишнего.
Код:
Получить символ:
   Если текущий источник USART, то проверим буфер.
      Если буфер пустой, то поставим маркер что процесс находится в ожидании,
         и уснем чтоб не кушать батарею.
      Как только получили символ из буфера проверим не бряк ли это (';').
         Если бряк, то полностью перезапустим процесс.
         Если нет, то вернем полученный символ обработчику.
      Все, выходим.   
   Если источник не USART, то просто выходим, на текущий момент это не реализовано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 22:52 
Только пришел

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 28
Sphynx55 писал(а):
Почему каша, мне кажется все понятно, и ничего лишнего.

1. Зачем между case: и break код заключён в {} ?
2. Зачем после return стоит break ?
3. Зачем ничего не делающий default ?
4. Что возвращает функция ясли ни одна ветка switch не сработает?
Мне кажется для 10 строчек кода слишком много несуразностей.

Вы варнинги компилятора в /dev/null перенаправили?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 23:22 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 174
В логику работы не вдавался -- может и есть какие косяки, а так:
VladislavS писал(а):
1. Зачем между case: и break код заключён в {} ?

Внутри блока '{}' объявлена временная переменная 'temp', фигурные скобки ограничат область видимости этой переменной.
VladislavS писал(а):
2. Зачем после return стоит break ?

Привычка писать 'break' после каждого 'case' -- у меня тоже такая привычка есть.
VladislavS писал(а):
3. Зачем ничего не делающий default ?

Затем, что в "переключателе" должны обрабатываться все случаи. default -- для всех остальных.
VladislavS писал(а):
4. Что возвращает функция ясли ни одна ветка switch не сработает?

Это ошибка. defaut должен был за это отвечать.
VladislavS писал(а):
Мне кажется для 10 строчек кода слишком много несуразностей.

Всего одна несуразность, связанная с возвратом из функции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 23:43 
Только пришел

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 28
Netzschlange писал(а):
Внутри блока '{}' объявлена временная переменная 'temp', фигурные скобки ограничат область видимости этой переменной.

Вы сами то в это верите? После использования глобальной mc_cr_src автор локальной temp область видимости ограничил. Ага, ага :D О чем вам говорит вот это - default: {} ?

Netzschlange писал(а):
Привычка писать 'break' после каждого 'case' -- у меня тоже такая привычка есть.

Ещё раз верю. Особенно когда у default по привычке break не обнаружен.

Netzschlange писал(а):
Затем, что в "переключателе" должны обрабатываться все случаи. default -- для всех остальных.

Того то я вижу прямо кучу случаев. Аж один. Ну да ладно, к этому я не придирался - понятно, что это заготовка на будущее.

Извините за грубость, но это и есть говнокод в чистом виде.


Последний раз редактировалось VladislavS 17 янв 2018, 00:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 17 янв 2018, 00:06 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 174
VladislavS писал(а):
это и есть говнокод в чистом виде.

Здесь Вы слишком заблуждаетесь.
Если ставить лишние скобки, break'и, табуляции и т.п. -- это можно отнести к говно-стилю оформления кода, но ни как к говно-коду.
А вот, например, если Вы в объявлении функции укажете, что она принимает только один параметр типа 'char *', а в самой функции с таким параметром будете работать как со строкой определённой длины. Или Ваша функция будет возвращать указатель на память, выделенной (malloc, new) внутри этой самой функции. То вот это и есть говно-код.
Это всего лишь пара примеров реального говно-кода, коих великое множество...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 17 янв 2018, 00:18 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 174
VladislavS писал(а):
Извините за грубость, но это и есть говнокод в чистом виде.

Пока сочинял предыдущее сообщение Вы изменили свой пост, поэтому несколько дополнительных комментариев:
VladislavS писал(а):
Вы сами то в это верите? После использования глобальной mc_cr_src автор локальной temp область видимости ограничил.

Относительно верю (ещё раз повторю -- всю логику не смотрел). Переменная 'mc_cr_src' используется в качестве ключа для 'switch', А переменная 'temp' локальная внутри определённого 'case'. Если в кавычки '{}' не включить, то область видимости выйдет за пределы 'case', в котором объявлена переменная.
VladislavS писал(а):
Ещё раз верю. Особенно когда у default по привычке break не обнаружен.

У default оператор break не нужен. default всегда располагается последним в switch.
VladislavS писал(а):
Того то я вижу прямо кучу случаев. Аж один. Ну да ладно, к этому я не придирался - понятно, что это заготовка на будущее.

Не важно сколько случаев. И Вы правы код похож на заготовку с учетом будущего рефакторинга.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 107 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: VladyMile


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB