|
IAR и sprintf |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 26)
|
Jul 27 2006, 18:14
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(rezident @ Jul 27 2006, 21:08)  Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне. Указатель ставил - непомогает В winavr этот код работает нормально На массив вместо указателя неругается ни winavr ни IAR По поводу ST1 и ST2 - поправил - всеравно глюк остался
|
|
|
|
|
Jul 28 2006, 06:47
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(rezident @ Jul 27 2006, 21:08)  Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне. Попробывал - непомогает Первый раз функция отробатывает нормально второй и все последующие - глючно Какбудто какаято из переменных локальных не инициализируется Оптимизация отключена
|
|
|
|
|
Jul 28 2006, 07:29
|

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

|
Цитата(rezident @ Jul 27 2006, 20:08)  Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне. В данном случае все правильно. STR1 и STR2 - массивы из 16 элементов типа char. Поскольку массивов как таковых в С нет, то имя массива тождественно указателю на его первый элемент. Т.е. STR1, STR2 имеют тип char *. Поэтому запись char *ptr = STR1; вполне корректна. Она тождественна записи char *ptr = &STR1[0]; И с другой стороны в С массивы в функции передаются как указатель на первый элемент. Так что с какой стороны ни подойди - в этом месте ошибки нет. Цитата(DeXteR @ Jul 27 2006, 19:51)  В первом случае функция sprintf работает нормально во втором - глючно А если поменять их местами? Т.е. проблема в чем - вообще любой второй вызов функции глючит или именно преобразование отрицательного числа? Пока могу предположить налезание стеков друг на друга. sprintf требовал стека более 100 байт. Сколько точно - не помню :-( А! можно в .map посмотреть.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 28 2006, 08:17
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(Сергей Борщ @ Jul 28 2006, 11:29)  А если поменять их местами? Т.е. проблема в чем - вообще любой второй вызов функции глючит или именно преобразование отрицательного числа? Пока могу предположить налезание стеков друг на друга. sprintf требовал стека более 100 байт. Сколько точно - не помню :-( А! можно в .map посмотреть. Менял местами - эффект тотже Второй раз выводит число не 1 раз а всю строку Очень прошу вас - укажите пожалуйста с какими настройками стека и в каком коде функция в ваших проэктах работает нормально Спасибо De}{teR
|
|
|
|
|
Jul 28 2006, 09:21
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 30-01-06
Пользователь №: 13 775

|
to DeXteR по синтаксису все верно, все же это что-то с компиллером
|
|
|
|
|
Jul 28 2006, 09:36
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(UFO @ Jul 28 2006, 13:21)  Library Options -> Printf formatter -> Small Или System -> Data Stack (CSTACK) -> 0x40. Это при модели памяти small. УРААААА Все заработало ОГРОМНОЕ СПАСИБО У меня был не Printf formatter -> Small а medium Сделал Small и все перестало глючить А с medium может работать или глючит всегда Кто знает ? Кто пробывал ? Какой стек для этого нужен ?
|
|
|
|
|
Aug 1 2006, 07:06
|

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

|
Цитата(rezident @ Jul 28 2006, 12:41)  Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции  Лето... отпуск только через 2 недели. Совсем я плохой стал. Код char STR1[16]; char STR2[16];
sprintf(STR2, "%i", NUM); sprintf(STR1, "%i", NUM2); Не вижу тут ошибки... :-(
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 1 2006, 07:25
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(Сергей Борщ @ Aug 1 2006, 11:06)  Цитата(rezident @ Jul 28 2006, 12:41)  Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции  Лето... отпуск только через 2 недели. Совсем я плохой стал. Код char STR1[16]; char STR2[16];
sprintf(STR2, "%i", NUM); sprintf(STR1, "%i", NUM2); Не вижу тут ошибки... :-( Она была Я ее подправил отредактировав сообщение после замечания rezident Она была но вы ее незастали
|
|
|
|
|
Jan 23 2007, 11:59
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Уважаемые специалисты Хочу продолжить эту тему потомучто наступил на грабли второй раз В Проекте нужен СПринтФ с форматирование Например так Код #include "iom8.h" #include <stdio.h> #include <stdlib.h>
char S[32] = "Hello .. Lalala"; long L = 1234567890;
void second(void) { sprintf(S+17, "%ld", L); }
void first(void) { second(); }
int main(void) { while(1) { first(); } } Под Atmega8 с памятью Tiny все работает После того как переключаем на small программа переполняет стек (гдето в библиотеках- отладчиком невидно) и контроллер сбрасывается Увеличение стеков и хипа эффекта недало Вопросс следующий Можно ли заставить ПринтФ (СПринтФ) от ИАР работать правильно ?? Если у когото есть опыт борьбы с этой функцией - пожалуйста поделитесь
|
|
|
|
|
Jan 23 2007, 15:14
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(IgorKossak @ Jan 23 2007, 14:34)  Изменение хипа (кучи) в данном случае ничего не даёт. Заставить работать можно пользуясь отладчиком или на худой конец симулятором. Увеличьте стек максимально возможно (стек данных). Заполните стек какой-нибудь величиной (в симуляторе). Запустите функцию и проверьте потребление стека. Отладчиком Видно что гдето в библиотеках (отладка по дизасемблеру) происходит исчерпание стека Тоесть не переполнение (увеличивать размер бесполезно) а наоборот Что делают в таких случаях ??
|
|
|
|
|
Jan 23 2007, 16:19
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(IgorKossak @ Jan 23 2007, 17:06)  Собрал Ваш пример. Увеличение стека данных до 0х160 (навскидку) и стека возвратов до 40 помогло. Модель памяти small, форматтер medium, симулятор - IAR.
Посмотрел использование стека данных, примерно 112 байт. А у меня АВРстудио пишет с вашими настройками AVR Simulator: Stack Overflow at 0x003e AVR Simulator: Stack Overflow at 0x012a Если несложно файлик с проэктом можно посмотреть ? А какиой версией вы пользуетесь ??
|
|
|
|
|
Jan 23 2007, 16:39
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(IgorKossak @ Jan 23 2007, 17:25)  Версия 4.21а, но я думаю, что значения это не имеет. Проект прикрепляю.
Test.rar ( 24.01 килобайт )
Кол-во скачиваний: 185У меня версия 4.20а с патчами для хлинка При открытии проэкта настройки слетели так как версия у меня младше Выставил процессор стеки мемори модель и настройки принтф Генерирую ubroff8 файл Аврстудия говорит AVR Simulator: Stack Underflow at 0x0328 AVR Simulator: Stack Underflow at 0x0328 AVR Simulator: Stack Underflow at 0x0040 AVR Simulator: Stack Underflow at 0x0042 AVR Simulator: Stack Underflow at 0x027a Наверно у меня нелучшая версия компилятора - Качаю новую
|
|
|
|
|
Jan 23 2007, 17:14
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Скачал 4.21а с этого сайта Скомпилировал проект ТЕСТ без изменения настроек Только сделал чтоб он генерировал ubroff8 формат для астудии Астудия пишет Код AVR Simulator: Stack Underflow at 0x027a AVR Simulator: Stack Underflow at 0x027a AVR Simulator: Stack Underflow at 0x027a AVR Simulator: Stack Underflow at 0x027a AVR Simulator: Stack Underflow at 0x027a AVR Simulator: Stack Underflow at 0x0328 AVR Simulator: Stack Underflow at 0x0328 AVR Simulator: Stack Underflow at 0x0040 AVR Simulator: Stack Underflow at 0x0042 Но процессор не сбрасывается Протеус неругается вообще Может это глюк студии или формата - страшно - но продолжаю работать с проэктом в новом компиляторе
|
|
|
|
|
Jan 23 2007, 18:12
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(IgorKossak @ Jan 23 2007, 18:47)  Может и вовсе не стОит AVRStudio юзать? Ну незнаю По моиму по удобству интерфейса лучше нету ничего И протеус я тоже очень люблю + счас мне нужно отладит 2 меги связаные по УАРТ + ЛСД Первая + ЛСД заработала нормально - дело за второй Но всеже немного пугает эта ошибка - А вдруг она потом вылезит в непонятных местах
|
|
|
|
|
Jan 24 2007, 19:11
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(IgorKossak @ Jan 24 2007, 17:46)  Цитата(DeXteR @ Jan 23 2007, 17:12)  Но всеже немного пугает эта ошибка - А вдруг она потом вылезит в непонятных местах
Сдаётся мне, что нет там никакой ошибки, видимо это AVRStudio не въехала в ситуацию. Наверное да Нужно попробывать тожесамое на Астудии 3.56 (но незнаю берет ли она кофф) По крайне мере в протеусе и в железе все работает хорошо Но ИАР 4.20 компилировал мне жуткую муть - Дайбог в 4.21 все будет хорошо
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|