23.02.2013, 02:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от SasaVitebsk
|
Поэтому удивляет, когда народ Си ругает, хотя Си - это просто инструмент. И им надо грамотно пользоваться ...
|
Это да. К нему еще надо привыкнуть, особенно к микроконтроллерному.
Признаюсь, я намучался с приведением типов. Конструкция была примерно такая:
PHP код:
|
//Конвертация штампа в массив времени индикатора
void TimeStamp_to_DataTime(unsigned long int ST)
{
unsigned char i;
for(i=0; i‹4; i++)
{
DataTime[i]=ST/koef[i];
ST-=DataTime[i]*koef[i];
}
DataTime[i]=ST;
}
|
массив koef -unsigned long int, а вот DataTime -unsigned char
Процедура работала, все отображалось правильно, но программа в некоторых местах вылетала, портила переменные никак не связанные с индикацией, в общем была непредсказуемой. Какая-то неотлавливаемая и непонятная чертовщина. Два дня - хоть вешайся.
Когда привел строго к типам:
PHP код:
|
//Конвертация штампа в массив времени индикатора
void TimeStamp_to_DataTime(unsigned long int ST)
{
unsigned char i;
unsigned long int j;
for(i=0; i‹4; i++)
{
j =ST / koef[i];
DataTime[i] =(unsigned char)j;
ST-=j * koef[i];
}
DataTime[i]=(unsigned char)ST;
}
|
все стало на свои места.
Насколько мне стало понятно, даже если программа все вроде считает и показывает правильно, то все равно НЕОБХОДИМО приводить типы данных.
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
24.02.2013, 20:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: IAR Embedded Workbench
Вот еще вопрос такого плана.
Возможна ли нормальная работа 8-ми битных контроллеров с числами long long (double)?
Где можно почитать на эту тему, желательно на русском, подозреваю, что дело в настройках среды.
Решил в целях освоения СИ и IAR сделать себе на кухню таймер с цифровой коррекцией хода, а там без 64-битных чисел не обойтись.
У меня переменные налазят друг на друга при операциях именно с long long с и портят друг-друга. Компилятор ошибок не выдает.
IAR C/C++ Compiler V5.51.0.50312/W32 for Atmel AVR
Контроллер ATMega8a.
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
24.02.2013, 21:27
|
|
Гражданин KAZUS.RU
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 866
Сказал спасибо: 99
Сказали Спасибо 216 раз(а) в 140 сообщении(ях)
|
Re: IAR Embedded Workbench
Здесь кто то выкладывал библиотеку для дублей, и совсем не давно.
А вообще зачем такая разрядность, в году 31 536 000 секунд???
__________________
Не ошибается лишь тот, кто ни чего не делает!
|
|
|
|
24.02.2013, 21:58
|
|
Частый гость
Регистрация: 21.02.2013
Адрес: Волгодонск
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от gary2007
|
Возможна ли нормальная работа 8-ми битных контроллеров с числами long long (double)?
Где можно почитать на эту тему, желательно на русском,
|
По алгоритмам классика
Д.Кнут "Искусство программирования для ЭВМ. том 3 Получисленные алгоритмы"
|
|
|
|
24.02.2013, 21:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от woroba
|
А вообще зачем такая разрядность
|
Я секунду меряю в тиках за час, два... до 24 часов, потом ввожу коррекцию для 16-ти битного таймера, который ее формирует. Поэтому каждая секунда будет уже откорректирована по длительности. В двух словах как-то так.
Что за
Сообщение от woroba
|
библиотеку для дублей
|
и где она, а главное зачем.
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
24.02.2013, 23:15
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
Всё смешалось кони люди...
1. double это число с плавующей запятой удвоенной точности. 8 байт.
long long это 64 битное целое число. Тоже 8 байт. Это вещи совершенно разные ... в принципе и в обработке. Например умножение long long чисел займёт десятки тактов, а умножение double тысячи либо десятки тысяч. Для 8-битного контроллера ....
2. Компилятор не сделает ошибки, если вы применили стандартный тип. И уж тем более никогда не залезет на другую переменную. Для этого он и компилятор. Это может происходить лишь по причине неграмотного использования указателей, массивов либо неверного указания размера стека.
3. Действия компилятор по приведению типов строго регламентировано стандартом языка. По умолчанию все арифметические выражения будут приводится к базовому типу (int), соответственно для работы с long int необходимо указывать конкретно.
|
|
|
|
24.02.2013, 23:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: IAR Embedded Workbench
Изменил в General Options параметр Memory model с Tiny на Small, а также добавил во вкладке Systems размер CSTACK до 0x40 против 0x20 - все пошло.
Почему же тогда компилятор гордо молчал, что ему места мало?
ps
Вы уж меня простите за нубские вопросы.
__________________
Мелочи не решают главного. Они решают всё!
Последний раз редактировалось gary2007; 24.02.2013 в 23:22.
|
|
|
|
25.02.2013, 00:09
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от gary2007
|
Почему же тогда компилятор гордо молчал, что ему места мало?
|
![Валяюсь от смеха](images/smilies/icon_biggrin.gif) Компилятору достаточно места ...
Вашей программе его было мало ... А компилятору в IBM-ке полно места ...
====
Представьте, что вы выдаёте билеты и вам надо их столько выдать, чтобы все уехали ... Но только вы маршрут автобуса не знаете и число остановок детально тоже ...
Но при этом кассир выдал билеты правильно ... А то что автобус по ходу езды ещё подобрал десятки людей ... ктож виноват?
===
Определить глубину стека задача не очень простая.... Самый простой способ запустить на выполнение процессор под отладчиком и посмотреть куда залез стек.... Либо высчитать. Глубину стека для каждой п/п компилятор считает. надо только вложенность оценить ...
|
|
|
|
25.02.2013, 00:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: IAR Embedded Workbench
Т.е. то, что я ему изначально ввожу тип контроллера из его же списка и говорю, что буду использовать числа 64 бит этого не достаточно?
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
25.02.2013, 00:48
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
А какое это вообще к стеку имеет отношение? К стеку имеет отношение например уровень вложенности подпрограмм и прерываний. Сколько у вас переменных локальных в п/п. Внешние вызовы ... Например ф-ции printf много памяти жрут... Причём в зависимости от числа и вида аргументов ...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Подниму тему WinAVR vs IAR
|
oleg110592 |
Микроконтроллеры, АЦП, память и т.д |
5 |
24.10.2015 14:06 |
Часовой пояс GMT +4, время: 22:13.
|
|