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

 
 
> IAR и sprintf
DeXteR
сообщение Jul 27 2006, 16:51
Сообщение #1


Местный
***

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



Добрый день Уважаемый специалисты

Пишу простой код в IAR EWAVR 4.20
В первом случае функция sprintf работает нормально
во втором - глючно

Подскажите что я делаю нетак ??


#include "iom16.h"
#include "stdio.h"

int NUM = 1234;
char STR1[16];

int NUM2 = -1234;
char STR2[16];


int main( void )
{

sprintf(STR2, "%i", NUM);
sprintf(STR1, "%i", NUM2);


while (1)
{}

}
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 26)
rezident
сообщение Jul 27 2006, 17:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jul 27 2006, 18:14
Сообщение #3


Местный
***

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



Цитата(rezident @ Jul 27 2006, 21:08) *
Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.


Указатель ставил - непомогает

В winavr этот код работает нормально
На массив вместо указателя неругается ни winavr ни IAR

По поводу ST1 и ST2 - поправил - всеравно глюк остался
Go to the top of the page
 
+Quote Post
vet
сообщение Jul 27 2006, 22:11
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Возможно, дело в настройках Printf formatter (свойства проекта).
Попробуйте поменять для начала %i на %d.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jul 28 2006, 06:47
Сообщение #5


Местный
***

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



Цитата(rezident @ Jul 27 2006, 21:08) *
Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.


Попробывал - непомогает

Первый раз функция отробатывает нормально

второй и все последующие - глючно
Какбудто какаято из переменных локальных не инициализируется
Оптимизация отключена
Go to the top of the page
 
+Quote Post
KRS
сообщение Jul 28 2006, 07:11
Сообщение #6


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Я думаю в printf лучше действительно использовать %d (%i для scanf )

А еще насколько я помню IARовские функции printf и scanf требовали довольно большого стека

Лучше всего попроверить в симуляторе по шагам
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 28 2006, 07:29
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jul 28 2006, 08:17
Сообщение #8


Местный
***

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



Цитата(Сергей Борщ @ Jul 28 2006, 11:29) *
А если поменять их местами? Т.е. проблема в чем - вообще любой второй вызов функции глючит или именно преобразование отрицательного числа? Пока могу предположить налезание стеков друг на друга. sprintf требовал стека более 100 байт. Сколько точно - не помню :-( А! можно в .map посмотреть.



Менял местами - эффект тотже
Второй раз выводит число не 1 раз а всю строку

Очень прошу вас - укажите пожалуйста с какими настройками стека и в каком коде функция в ваших проэктах работает нормально

Спасибо
De}{teR
Go to the top of the page
 
+Quote Post
CSB
сообщение Jul 28 2006, 09:09
Сообщение #9


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

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Library Options -> Printf formatter -> Small

Или

System -> Data Stack (CSTACK) -> 0x40.
Это при модели памяти small.

При tiny все работает без изменений параметров стека.
Go to the top of the page
 
+Quote Post
UFO
сообщение Jul 28 2006, 09:21
Сообщение #10


Участник
*

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



to DeXteR
по синтаксису все верно, все же это что-то с компиллером
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jul 28 2006, 09:36
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 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 может работать или глючит всегда
Кто знает ? Кто пробывал ? Какой стек для этого нужен ?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 28 2006, 09:41
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Сергей Борщ @ Jul 28 2006, 13:29) *
Цитата(rezident @ Jul 27 2006, 20:08) *

Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.
В данном случае все правильно. STR1 и STR2 - массивы из 16 элементов типа char. Поскольку массивов как таковых в С нет, то имя массива тождественно указателю на его первый элемент. Т.е. STR1, STR2 имеют тип char *. Поэтому запись char *ptr = STR1; вполне корректна. Она тождественна записи char *ptr = &STR1[0];
И с другой стороны в С массивы в функции передаются как указатель на первый элемент. Так что с какой стороны ни подойди - в этом месте ошибки нет.

Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции smile.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 1 2006, 07:06
Сообщение #13


Гуру
******

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



Цитата(rezident @ Jul 28 2006, 12:41) *
Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции smile.gif
Лето... отпуск только через 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)
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Aug 1 2006, 07:25
Сообщение #14


Местный
***

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



Цитата(Сергей Борщ @ Aug 1 2006, 11:06) *
Цитата(rezident @ Jul 28 2006, 12:41) *

Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции smile.gif
Лето... отпуск только через 2 недели. Совсем я плохой стал.
Код
char STR1[16];
char STR2[16];

sprintf(STR2, "%i", NUM);
sprintf(STR1, "%i", NUM2);
Не вижу тут ошибки... :-(


Она была

Я ее подправил отредактировав сообщение после замечания rezident

Она была но вы ее незастали smile.gif
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 23 2007, 11:59
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 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 программа переполняет стек
(гдето в библиотеках- отладчиком невидно) и контроллер сбрасывается
Увеличение стеков и хипа эффекта недало

Вопросс следующий

Можно ли заставить ПринтФ (СПринтФ) от ИАР работать правильно ??
Если у когото есть опыт борьбы с этой функцией - пожалуйста поделитесь
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 23 2007, 13:34
Сообщение #16


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Изменение хипа (кучи) в данном случае ничего не даёт.
Заставить работать можно пользуясь отладчиком или на худой конец симулятором.
Увеличьте стек максимально возможно (стек данных). Заполните стек какой-нибудь величиной (в симуляторе). Запустите функцию и проверьте потребление стека.
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 23 2007, 15:14
Сообщение #17


Местный
***

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



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


Отладчиком Видно что гдето в библиотеках (отладка по дизасемблеру) происходит исчерпание стека
Тоесть не переполнение (увеличивать размер бесполезно) а наоборот

Что делают в таких случаях ??
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 23 2007, 16:06
Сообщение #18


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Собрал Ваш пример.
Увеличение стека данных до 0х160 (навскидку) и стека возвратов до 40 помогло.
Модель памяти small, форматтер medium, симулятор - IAR.

Посмотрел использование стека данных, примерно 112 байт.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 23 2007, 16:18
Сообщение #19


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(DeXteR @ Jan 23 2007, 14:14) *
Отладчиком Видно что гдето в библиотеках (отладка по дизасемблеру) происходит исчерпание стека
Тоесть не переполнение (увеличивать размер бесполезно) а наоборот

Такие ситуации возможны когда в результате переполнения стека портится сам указатель стека, доступ к которому возможен не только из области регистров (0x3D), но и из памяти (0x5D).
Последствия этого могут быть самые неожиданные. w00t.gif
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 23 2007, 16:19
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 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

Если несложно файлик с проэктом можно посмотреть ?
А какиой версией вы пользуетесь ??
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 23 2007, 16:25
Сообщение #21


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Версия 4.21а, но я думаю, что значения это не имеет.
Проект прикрепляю.Прикрепленный файл  Test.rar ( 24.01 килобайт ) Кол-во скачиваний: 185
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 23 2007, 16:39
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 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

Наверно у меня нелучшая версия компилятора - Качаю новую
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 23 2007, 17:14
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 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


Но процессор не сбрасывается

Протеус неругается вообще

Может это глюк студии или формата - страшно - но продолжаю работать с проэктом в новом компиляторе
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 23 2007, 17:47
Сообщение #24


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Может и вовсе не стОит AVRStudio юзать?
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 23 2007, 18:12
Сообщение #25


Местный
***

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



Цитата(IgorKossak @ Jan 23 2007, 18:47) *
Может и вовсе не стОит AVRStudio юзать?

bb-offtopic.gif
blink.gif

Ну незнаю
По моиму по удобству интерфейса лучше нету ничего

И протеус я тоже очень люблю
+ счас мне нужно отладит 2 меги связаные по УАРТ + ЛСД

Первая + ЛСД заработала нормально - дело за второй

Но всеже немного пугает эта ошибка - А вдруг она потом вылезит в непонятных местах
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 24 2007, 16:46
Сообщение #26


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(DeXteR @ Jan 23 2007, 17:12) *
Но всеже немного пугает эта ошибка - А вдруг она потом вылезит в непонятных местах

Сдаётся мне, что нет там никакой ошибки, видимо это AVRStudio не въехала в ситуацию.
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 24 2007, 19:11
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 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 все будет хорошо
Go to the top of the page
 
+Quote Post

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

 


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


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