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

 
 
> Простые вопросы по IAR
Beginning
сообщение Aug 30 2007, 15:00
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Учусь работать в IAR. Много вопросов. Как обозначить глобальную переменную, что бы она была видна в других подлинковачных файлах.

Как обозначить переменную, что бы она лежала по конкретному адрессу.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
5 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 68)
jorikdima
сообщение Aug 30 2007, 15:08
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



тут не иар, тут с надо учить.

1. прочитайте про extern
2. прочитайте доку по линкеру
Go to the top of the page
 
+Quote Post
=F8=
сообщение Aug 30 2007, 15:33
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



На первый вопрос уже ответели, по поводу как разместить по конкретному адресу

неинициализируемая меременная
#pragma location = адрес
__no_init int ttt;

или
__no_init int ttt @адрес;

константа
#pragma location = адрес
const int ttt = 123;

или
const int ttt @адрес = 123;

Сообщение отредактировал =F8= - Aug 30 2007, 15:34
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 30 2007, 15:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Aug 30 2007, 18:00) *
Как обозначить глобальную переменную, что бы она была видна в других подлинковачных файлах.

Абсолютно так же как в любимом, как я слышал, Вами всей душой Keil и вообще в любом компиляторе 'C'.

P.S.
Место этого вопроса не в теме по АРМ. Перенес.

P.P.S.
В 'C' все глобальные переменные видны снаружи по умолчанию, если специально не ограничивать область видимости, но мне что-то подсказывает, что вопрос был не об этом.....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Aug 30 2007, 16:37
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Где в настройках IAR включить, что бы внешние переменные были глобальными, т.е виделись во всех файлах.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 30 2007, 16:52
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Aug 30 2007, 19:37) *
Где в настройках IAR включить

Повторяю - нигде. Они таковые по умолчанию и "галочками" естественно не отключаются. Тут уже было высказано предположение о том, что надо почитать про extern. Читать в любой книжке по "C".
Повторяю по "C" а не по Keil, IAR, GNU, Rowley, ибо это фича языка а не особенность компилятора.
Что касается допонительного вопроса по размещению чего-то по конкрктному адресу, то лучше этого не делать никогда.
А если уж сильно надо, то пользоватся надязыковыми средствами типа линкера. И только в наикрайнейшем случае следует пользоватся уникальными наворотами конкретного компилятора, прочитав документацию на конкретный компилятор. Что каксается IAR, то это зависит от версии. В 5.10,
например, похерили (ну и наверное правильно) инициализацию smile.gif что на самом деле ознает, что похерили все, ибо просто обращение по конкретному адресу не требует искуственных наворотов к языку. Правда линкер у них пока сырой (или я не врубился совсем), что связывает руки.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Aug 30 2007, 17:49
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Про EXTERN знаю. Я писал много под AVR. Гарвардская архитектура. Там три сегмента FLASH, ROM, DATA использовал, и всё было в шоколаде (CodeVisionAVR C Compiler). Глобальные переменные были видны во всех файлах, и не было проблем с дополнительными манипуляциями. Сейчас под ARM пишу, Фон Неймовская архитектура, и много вопросов появляется, наверняка являющиеся раздражительными и недостойными для местных гуру. А по конкретному адресу надо потому, что программа из внешней ROM работает, а переменная должна во внешней flash сохранятся.

Кстати хотел Вам zltigo ответить, хотя Вы всячески пытаетесь меня уязвить в неграмотности, но ладно, Вы мне отвечаете на вопросы, на поиск ответов на которые сейчас просто НЕТ ВРЕМЕНИ! Горит проект. И за это Вам спасибо. Так вот что такое listing, как не удивительно, я тоже знаю. Я говорил за удобство. В других оболочках (Keil, Cvision) мне было удобно работать так, а не просматривать listing. А в IAR я такой возможности, не обнаружил, поэтому и спросил.

Сообщение отредактировал Beginning - Aug 30 2007, 17:52


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 30 2007, 18:14
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Aug 30 2007, 20:32) *
Про EXTERN знаю. Я писал много под AVR. Гарвардская архитектура. Там три сегмента FLASH, ROM, DATA использовал, и всё было в шоколаде (CodeVisionAVR C Compiler). Глобальные переменные были видны во всех файлах
Цитата

Вы хоть поняли, что написали? Незнаю, что Вы там писали, но сие абсолютно платформенно независимая вещь.

наверняка являющиеся раздражительными и недостойными для местных гуру

Эти вопросы достаточно обычны, а вот что мне несколько не понравилось, так это Ваше совершенно ничем не спровоцированное выступление за один из компиляторов с нелестными эпитетами по поводу другого. Из которого вроде-бы следовало, что Автор всех собак съел на этом, хотя и не приступал к этой закуске smile.gif. Так что, простите, я на все через эту призму смотрю.
Цитата
А по конкретному адресу надо потому, что программа из внешней ROM работает, а переменная должна во внешней flash сохранятся.

О господи! Про указатели прочитайте, да?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Aug 30 2007, 18:25
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Да причём сдесь компилятор. Я же вам говорил, что мне по-барабану какой компилятор. Я за среду говорил. За её возможности в симуляции и отладке и редакторе, да.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 30 2007, 18:46
Сообщение #10


Гуру
******

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



Цитата(=F8= @ Aug 30 2007, 21:33) *
константа
#pragma location = адрес
const int ttt = 123;

или
const int ttt @адрес = 123;

Насчет последнего выражения с константой по-моему вы ошибаетесь. В последних версиях IAR выкинула такую конструкцию, чтобы более точно соответствовать стандарту. Где-то здесь на форме недавно постили выдержку из описания релиза по этому поводу. Примерный смысл такой: квалификатор const не обязывает к тому, что переменная с этим квалификатором обязана во Flash находиться. const указывает лишь на то, что это переменная не модифицируется.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 30 2007, 19:53
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Aug 30 2007, 21:25) *
..мне по-барабану какой компилятор.

Да, это заметно smile.gif.
Ладно, все - больше не буду.
Цитата(rezident @ Aug 30 2007, 21:46) *
В последних версиях IAR выкинула такую конструкцию...

Выкинули инициализацию. Осталось некоторая видимость ввиде указания адреса, что уже совершенно ненужный прибамбас, ибо штатными 'C' средствами решается.
Цитата
, чтобы более точно соответствовать стандарту

ну стандарт этого не определяет и не запрещает. Формат объектника на ELF поменяли а это
(как и исчезновение выкидывания неиспользуемых функций при линковке объектников) просто последствия. Зато теперь чужими линкерами и библиотеками можно пользоватся, что крайне неплохо.
Цитата
квалификатор const не обязывает к тому, что переменная с этим квалификатором обязана во Flash находиться. const указывает лишь на то, что это переменная не модифицируется.

Ну перебор smile.gif smile.gif smile.gif, естественно не для случая, когда явно указан адрес расположения переменной.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Aug 31 2007, 12:57
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



У меня есть функция обработки векторного прерывания IRQ таймера (IAR). Как мне обозначить функцию, чтобы компилятор корректно выходил из этой функции. Т.е со сменой режима IRQ->USER. Или в конце функции какой то оператор ставить надо.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Beginning
сообщение Aug 31 2007, 17:07
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



В IAR в симуляторе перефирийные регистры работают? Настраиваю таймер, а он не инкрементируется при симуляции.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 31 2007, 21:22
Сообщение #14


Гуру
******

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



Цитата(Beginning @ Aug 31 2007, 20:07) *
В IAR в симуляторе перефирийные регистры работают? Настраиваю таймер, а он не инкрементируется при симуляции.
Нет. Это описано в документации, как и ответ на ваш предыдущий вопрос.


--------------------
На любой вопрос даю любой ответ
"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
Beginning
сообщение Aug 31 2007, 22:14
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Какие все умные, всё в документацию тычут. Много слов пишут, вместо того чтобы написать два слова: __irq и VICVectAddr=0. У меня сейчас просто нет времени искать, потерял пол дня на поиск вот этого. cranky.gif


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
one_man_show
сообщение Sep 1 2007, 05:32
Сообщение #16


Помогу, чем смогу
******

Группа: Админы
Сообщений: 2 786
Регистрация: 28-05-04
Из: Москва
Пользователь №: 25



Уважаемый Beginning, пожалуйста не горячитесь. Почему Вы думаете, что только у Вас нет времени искать? Хорошо, что Вы иногда хоть благодарите за ответы, иначе получилось бы, что Вы работаете, а все остальные ждут Ваших вопросов, занимаются фигней и не удосуживаются дать конкретный ответ.

Удачи Вам в текущем срочном проекте! Мы Вас все прекрасно понимаем, так как многие из нас были, а кто-то и сейчас, находятся в цейтноте.


--------------------
С уважением,
Ваган Саруханов
Проекты|Форум|Facebook|Linkedin
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 1 2007, 08:59
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Да ладно, ни на кого зла не держу. Всё понимаю. Вот, например zltigo вывело то, что я нелестно о IAR отозвался (хотя он меня неправильно понял), а меня немного вывело то, что меня все вдруг начали считать неучем и нежелающим искать ответы. Я всегда ищу ответы САМ. Просто сейчас особый случай, ни сегодня, завтра проект сдавать. Вот и использую все возможные варианты. И в форум вопрос кину и параллельно сам ищу. Просто возникает множество мелких элементарных вопросов, которые просто требуют ответа типа ”да/нет”, и движешься дальше, решая уже сложные алгоритмические задачи. Ан нет, надо каждый раз спотыкаться, прекращать основную работу и искать, искать… Вообщем ещё раз скажу всем спасибо, кто помог, и тем кто возможно ещё поможет. beer.gif

Сообщение отредактировал Beginning - Sep 1 2007, 09:45


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 1 2007, 09:14
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 1 2007, 11:59) *
zltigo вывело то, что я нелестно о IAR отозвался

Повторяю. Отнюдь не это, а то, что Вы своими оценками превосходства одного из компиляторов, с походя опусканием другого, неверно спозиционировали свой уровень знаний и навыков. Что и привело к диссонансу между вопросами и ответами. IAR мне не брат и не кум - никакого особого пиетета я не испытываю, просто пользуюсь, как впрочем и еще тремя компиляторами, в повседневной жизни. А документация у IAR вполне хороша, систематизирована и поиск по PDF работает много быстрее, нежели вопрос-ответ в форуме.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 1 2007, 09:14
Сообщение #19


Гуру
******

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



Цитата(Beginning @ Sep 1 2007, 11:59) *
И в форум вопрос кину и параллельно сам ищу.
Help->C/C++ compiler reference->Search->"irq" Search->"interrupt". Это сложно? Это занимает полдня? Тогда не удивительно, что <<завтра проект сдавать, а у меня “конь не валялся”>> и я в шоке, насколько нетривиальные вопросы нас еще ожидают.

P.S. Там есть еще папка examples в директории компилятора.


--------------------
На любой вопрос даю любой ответ
"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
Beginning
сообщение Sep 1 2007, 09:48
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



N что __irq нашёл почти сразу. Вторая часть вопроса отняла время. Слушайте, никого не застовляю мне отвечать. Нихотите не надо. Спорить тоже не буду, времени нет. Да и топик вроде, как в "... для чайников" находится. И почему это вас всё так удевляет?


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 1 2007, 19:54
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Какую библиотеку в IAR для ARM надо подключить чтобы можно было использовать itoa (int->str)


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 1 2007, 21:09
Сообщение #22


Гуру
******

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



Цитата(Beginning @ Sep 2 2007, 01:54) *
Какую библиотеку в IAR для ARM надо подключить чтобы можно было использовать itoa (int->str)

ИМХО stdlib.h, но замечу, что itoa не является стандартной функцией Си, т.е. не включена в стандарт ANSI C. Стандартной функцией подобного преобразования является sprintf.
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 1 2007, 22:00
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



В IAR нет itoa. Использую во это:
Цитата
uint8* itoa(int val, int base)
{
static uint8 buf[32] = {0};
int i = 30;
for(; val && i ; --i, val /= base)
buf[i] = "0123456789abcdef"[val % base];
return &buf[i+1];
};


Вопрос. Как мне обозначить подключаемый asm файл с startup чтобы IAR его использовал, а не брал свой. А то возникает ошибка, мол два куска кода ссылаются на одни и те же адреса.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 2 2007, 08:58
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 2 2007, 01:00) *
В IAR нет itoa. Использую во это:

Это не itoa(), ни по формату, ни по отсутствию обработки отрицательных значений. Посему обозвать другим словом. При отрицательных значениях - глюки. Возвращаемое значение указатель на char а не на unsigned char, поскольку речь идет о строке. Последний оператор ; - лишний. --i вместо i--, естественно аболютно не принципиально, но заставляет читающео думать о каких-то наихитрейших хитростях. Вынесение присвоения i из for, тоже ничем не обосновано и сбивает процесс чтения. Значения 0 обычно как '0' печатают а не 'ничего'.
Проверка i - лишняя, ибо буфер под строчку достаточной длинны.
Код
char *ulongtoa( unsigned long val, int base )
{
static char buf[32+1] = {0};
int i = 32-1-1;
    do
    {  buf[i--] = "0123456789abcdef"[val % base];
        val /= base;
    }
    while( val );  
    
    return( &buf[i] );
}

Цитата
Как мне обозначить подключаемый asm файл с startup чтобы IAR его использовал, а не брал свой.

"Cвой" он естественно не берет, если явно не указано линковать, например, объектник - разбирайтесь с 'галочками'.
Цитата
А то возникает ошибка, мол два куска кода ссылаются на одни и те же адреса.

????


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 2 2007, 14:45
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Есть 32-bit переменная. И есть 8-bit переменная. Какая конструкция используется (кроме сдвига) для копирования 8bit в разные части 32-bit переменной. Т.е в первый, второй, или третий байт.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 2 2007, 15:07
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Общий случай элементарные логические операции:
Код
my_long  = my_byte;
my_long |= (long)my_byte << 8;
...
my_long |= (long)my_byte << 24;

А конкретный эффективный вариант зависит от того, как хранятся байтовые переменные.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 2 2007, 15:28
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Народ может, кто алгоритм подкинет, если есть, а то уже голова пухнет и не хочет работать. В общем, есть dallas таймер. Он вазвращает 32bit число – количество секунд. Так вот его надо раздраконить в минуты(char), часы(char), дни(char), месяц(char), год(short).

Спасибо a14.gif . Знал, что есть такая (раньше как-то видел), но забыл. На 8bit машине редко используется.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 2 2007, 15:36
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 2 2007, 18:28) *
Он вазвращает 32bit число

Нежелание ознакомится с языком, начинает превышать все разумные пределы
localtime() или gmtime().


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 2 2007, 16:11
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Ну почему же нежелание. Не было б желания, вообще не писал бы и не искал. Вот вы мне подсказали направление, где искать. Сейчас сижу, изучаю библиотеку time.h. Правда в help IAR по этим функциям оставляет желать лучшего, некоторые вообще, без каково либо описания, но ничего разберёмся.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 2 2007, 16:39
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 2 2007, 19:11) *
изучаю библиотеку time.h

Главное слово time какое незнакомое smile.gif ну ни в жисть не догадаться поискать smile.gif smile.gif smile.gif
Цитата
Правда в help IAR по этим функциям оставляет желать лучшего

Ну как-бы с одной сторны это не дело компилятора справочник по стандартному 'С' содержать, а так действительно поганенький sad.gif.
Возьмите книжку, просто книжку.
У меня к моей IDE подключены пяток "C" хелпов wink.gif на выбор и никакких проблем.
Из бесплатно-доступных приличный чисто языковый у OpenWatcom.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 2 2007, 18:12
Сообщение #31


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Я 24 часа на ногах в монитор смотрю. У меня в голову не то что, бы слово time не приходит, я уже частенько ловлю себя на мысле что, тупо смотрю в монитор и ничего не делаю.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 3 2007, 19:04
Сообщение #32


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Помогите найти засаду. Использую функцию localtime().

time_t n_sec;
struct tm *tm_p;

n_sec=time_;
tm_p = localtime(&n_sec);

Так вот. Код компилируется, но когда зашивается в проц, то проц виснет. Может какие специальные настройки надо. Она вроде кучу использует.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 3 2007, 21:15
Сообщение #33


Гуру
******

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



Цитата(Beginning @ Sep 3 2007, 22:04) *
Так вот. Код компилируется, но когда зашивается в проц, то проц виснет. Может какие специальные настройки надо. Она вроде кучу использует.
n_sec=1234;
tm_p = localtime(&n_sec);
И в симулятор, по шагам. Этот код не работает с периферией, поэтому отсимулироваться должен на "хорошо" и "отлично".


--------------------
На любой вопрос даю любой ответ
"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
Сергей Борщ
сообщение Sep 4 2007, 07:34
Сообщение #34


Гуру
******

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



Цитата(Сергей Борщ @ Sep 4 2007, 00:15) *
И в симулятор, по шагам.
Последовал своему совету. Функция действительно интересная. Она требует наличия сегмента HEAP и возвращает указатель на структуру. Казалось бы, она выделяет динамическую память. Ан нет, она возвращает указатель на статически выделенную область памяти в DATA_Z, а HEAP не используется совсем. Поэтому, если интуитивно попытаться осводить память под возвращенное значение (delete tm_p) можно получить крушение всей памяти. Угадал?


--------------------
На любой вопрос даю любой ответ
"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
Beginning
сообщение Sep 4 2007, 09:01
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



В симуляторе в функцию входит и выходит (как там винипух говорил). Но при зашитии в проц он фиснит. Т.е. код выолняется нормально, но когда доходит до localtime() зависает. Когда просматривал asm функции, то всречал редкие коментарии вставленные IAR типа "malloc" или "heap".

delete tm_p - это не использовал

Определяю структуру в main.c как глобальную:

struct {
uint8 a[6];
uint8 b[5];
uint8 c[4];
uint8 d[3];
uint8 e[3];
uint8 f[6];
} data;

В другом файле хочу использовать её:

extern strucr data;

data.a[0]=10;

Возникает предупреждение:
Warning[Pe1000]: a storage class may not be specified here E – на вот это ”extern strucr data;

И далее ошибки:

Error[Pe020]: identifier "data" is undefined

В чём засада?


Пробывал обычный int x; в другом файле extern int x; Всё прокатывает. Struct воспринимается же, тоже как переменная. Но не работает.

Сообщение отредактировал Beginning - Sep 4 2007, 09:02


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 4 2007, 09:50
Сообщение #36


Гуру
******

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



Цитата(Beginning @ Sep 4 2007, 12:01) *
В симуляторе в функцию входит и выходит (как там винипух говорил). Но при зашитии в проц он фиснит. Т.е. код выолняется нормально, но когда доходит до localtime() зависает.
Ну, возможно ваша версия использует heap. Вы еще где-то используете malloc, new и т.д.? Если нет, сколько памяти вы выделили под сегмент HEAP? Возможно зависание происходит из-за невозможности выделить достаточно памяти. Хотя тогда должно и в симуляторе виснуть. Я все же склонен считать, что чудес не бывает и "зависание" происходит по причине нехватки памяти, например - стека.
Цитата(Beginning @ Sep 4 2007, 12:01) *
Определяю структуру в main.c как глобальную:
А ведь говорили - внимательно прочитайте учебник про extern. Когда вы компилируете другой файл, компилятор понятия не имеет ни о main.c, ни о том, какие поля есть у описанной там структуры.
Цитата(Beginning @ Sep 4 2007, 12:01) *
Возникает предупреждение:
Warning[Pe1000]: a storage class may not be specified here E – на вот это ”extern strucr data;
strucr вместо struct.
Цитата(Beginning @ Sep 4 2007, 12:01) *
И далее ошибки:

Error[Pe020]: identifier "data" is undefined

В чём засада?
Пробывал обычный int x; в другом файле extern int x; Всё прокатывает.
Потому что int, char, float, указатели - это встроенные типы. А структуры - это типы, определяемые пользователем. Попробуйте так:

"в другом файле":
extern struct {
uint8 a[6];
uint8 b[5];
uint8 c[4];
uint8 d[3];
uint8 e[3];
uint8 f[6];
} data;

Потом когда захотите внести изменение в эту структуру и полезете по всем файлам искать и править ее объявление - прочитайте в букваре по С про заголовочные файлы.


--------------------
На любой вопрос даю любой ответ
"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
zltigo
сообщение Sep 4 2007, 10:13
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Sep 4 2007, 10:34) *
Функция действительно интересная.

Она много еще чего требует - установки временной зоны, правил перехода летнее/зимнее время ...
Попробуйте для начала gmtime(). А потом уже на локальное переходить.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 4 2007, 11:41
Сообщение #38


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Цитата
strucr вместо struct.


Очепятка. В исходниках верно написано.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 5 2007, 07:09
Сообщение #39


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Попробывал использовать Гринвичское время gmtime(), всё заработало наура.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 5 2007, 08:25
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 5 2007, 10:09) *
Попробывал использовать Гринвичское время gmtime(), всё заработало наура.

Ну если лето/зима/временная_она не нужны, что маловероятно, то пользуйтесь. В противном случае разбирайтесь с IARовской _Tzoff(void), которая отвечает за все вышеперечисленное и теми параметрами которыми она пользуется.
Я лично с начала 90x, когда передомною возникла такая проблема для встоенной системы ушел на "свою" сделаннаю по мотивам борландовской библиотечной, но со статическим tm и 'универсальным' 16bit идентификатором летнего времени
[StartMonth]
[EndMonth]
[Style]
[ChangeHour]
задаваемым в конфигурации.

Кстати, совет - системные часы должны идти по Гринвичу, а не по локальному времени, как это в свое время сделали недоумки( это не ругательство это констатация факта) из MS.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 5 2007, 11:50
Сообщение #41


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



А что вы имели под "лето/зима/временная_она"? В смысле летнее/зимнее время. Мне оно не нужно. На час вперёд и назад можно руками перевести. А почем, мне надо использовать в системе именно время по Гринвичу? Это автономная система с часами реального времени (возвращает int32 – количество секунд). Получил с этих часов время, отправил в gmtime() и забрал полученные часы, дни, месяцы и др. из структуры. Или здесь где-то засада зарыта?


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 5 2007, 12:08
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 5 2007, 14:50) *
А что вы имели под "лето/зима/временная_она"? В смысле летнее/зимнее время. Мне оно не нужно. На час вперёд и назад можно руками перевести.

Ну не нужно, так не нужно (хотя не красиво ) тогда часы идут по локальному времени а находитесь Вы все равно где, пусть и в Гринвиче smile.gif.
Цитата
Или здесь где-то засада зарыта?

Если Вы живете по Гринвичу/UTC называя это своим локальным временем, то никаких проблем нет.
Проблемы с зонами и переходами лето/зима. В случае часов по гринвичу они НИКОГДА не переставляются и вычисляется только поправка. В случае системных часов по локальному времени ВАМ ПРИДЕТСЯ ПЕРЕСТАВЛЯТЬ ЧАСЫ, что само по себе может быть неудобным и в придачу возникают неопределенности, например, Вы включили устройство в 2:30 минут (по системныи часам) в день перехода веремени - который час? Ответ не возможен без дополнительного знания о том какое время лето/зима сейчас часы показывают.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 6 2007, 07:35
Сообщение #43


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Как-то странно работает float.
Например:
float f;
int x=56;
f= 4567/x;
// f=81,5535…
f*=100;
//f должен быть равен 8155,35…
x=f;
и получаем х=8100;

Вобщем вот это “f*=100;” похоже умножает только целую часть.

Мне надо получить дробную, в чём засада.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 6 2007, 08:02
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



А что, интересно, должно было получиться, если делить int на int ?
Код
float x=56;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 6 2007, 13:11
Сообщение #45


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



const uint8 x[4][4]= { (1,2,3,4),
(1,2,3,4),
(1,2,3,4),
(1,2,3,4)
};

Почему на это выражение ругается.
Выдаёт:
Error[Pe057]: this operator is not allowed in a constant expression


float x=56;

Вообще то логично. a14.gif


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 6 2007, 13:11
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Код
const uint8 x[4][4]= { (1,2,3,4),
(1,2,3,4),
(1,2,3,4),
(1,2,3,4)
};

Чем дальше в лес, тем больше дров sad.gif. Может стоит хоть книжку по С прочитать? Компилятору не по барабану круглые или фигурные скобки.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 6 2007, 13:46
Сообщение #47


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Вырезка из книги Керинан и Ричи:

STATIC INT DAY_TAB[2][13] = {
(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
(0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
};

Я использовал эту конструкцию в CodeVision, и не было никаких ошибок.
И кому здесь по барабану? cranky.gif


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 6 2007, 14:04
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 6 2007, 16:46) *
И кому здесь по барабану? cranky.gif

Правильному компилятору не по барабану мусорные круглые скобки. Либо уберите их совсем и неявно инициализируйте многомерный массив одномерным,
Код
const uint8 x[4][4]= { 1,2,3,4,
1,2,3,4,
1,2,3,4,
1,2,3,4
};

либо инициализируйте многомерные массивы, как положено - фигурными скобками.
Код
const uint8 x[4][4]= { {1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4}
};


Цитата
Вырезка из книги Керинан и Ричи:

Компиляторы с опцией компилировать в стиле K&R уже почти вымерли и слава богу, ибо есть С99.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 6 2007, 14:11
Сообщение #49


Гуру
******

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



Цитата(zltigo @ Sep 6 2007, 11:02) *
Код
float x=56;
или f= 4567.0/x; В данном примере все равно, но если перед этим с x производятся какие-то действия, то разница будет.


--------------------
На любой вопрос даю любой ответ
"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
Beginning
сообщение Sep 6 2007, 14:12
Сообщение #50


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Какой же это правильный компилятор, если не по ANSI C делает. А вы, прежде чем в книги отсылать, лучше бы попробовали сами. На конструкцию предложенною вами у компилятора вообще аллергия:
const uint8 dd[4][]{ {1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4} };
Error[Pe098]: an array may not have elements of this type
Error[Pe065]: expected a ";"

Я к стати эту конструкцию пробывал, ещё до обсуждения.

Сообщение отредактировал Beginning - Sep 6 2007, 14:19


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 6 2007, 14:35
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 6 2007, 17:12) *
лучше бы попробовали сами.

Не буду я пробовать - оно работает и без моих проб smile.gif
Цитата
На конструкцию предложенною вами у компилятора вообще аллергия:
const uint8 dd[4][]{ {1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4} };

Обратите свой ясный взор на мой пост и на то, что Вы здесь нагородили и найдите два отличия
1. Нет явного указания для размерности многомерного массива;
2. Компилятору не по барабану отсутствие оператора присвоения.
Цитата
Я к стати эту конструкцию пробывал, ещё до обсуждения.

Ага smile.gif, два раза.
Цитата
Какой же это правильный компилятор, если не по ANSI C делает.

K&R это не ANSI С и не C99


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 6 2007, 14:46
Сообщение #52


Гуру
******

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



Цитата(Beginning @ Sep 6 2007, 17:12) *
Какой же это правильный компилятор, если не по ANSI C делает.

Я к стати эту конструкцию пробывал, ещё до обсуждения.
А что, ANSI C позволяет круглые скобки в этом месте вместо угловых?

Попробуйте добавить в начале файла #include <stdint.h>, заменить uint8 на uint8_t и добавить "равно"

На всякий случай - "стилем K&R" называется изложенный в первом издании их книги стиль. Если у вас первое издание - скачайте второе, оно уже про ANSI C.


--------------------
На любой вопрос даю любой ответ
"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
Beginning
сообщение Sep 6 2007, 14:56
Сообщение #53


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Присвоение недоглядел, разумеется в программе равно стояло. А число не ставил, т.к. при инициализации массива считал, что оно определяется автоматически.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Sep 6 2007, 15:09
Сообщение #54


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



терпиливые у нас гуру smile.gif
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 6 2007, 16:32
Сообщение #55


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



На то они и гуру. a14.gif


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 6 2007, 19:51
Сообщение #56


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Создаю массив ссылок на строки:
const uint8 *men0[]=
{
"Пункт 1",
"Пункт 2”,
“Пункт 3”
};

Затем вызываю функцию:

menu_(x,men0);

Функция типа:

void menu_(uint8 x, const uint8 **t)

В ней вызываю функцию печати:

lcd_puts(t[x]);

Компилится без ошибок. Но почему то, в lcd_puts не передаётся ссылка на строки, и печатается всякая хрень wacko.gif . В CodeVision это работало нормально.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 7 2007, 06:43
Сообщение #57


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 6 2007, 22:51) *
Но почему то, в lcd_puts не передаётся ссылка на строки

передаются, передаются - не надо диагнозы из пальца высасывать и рефреном повторять
глупости:
Цитата
В CodeVision это работало нормально.

Когда даже в элементарной набивке текста опечатка на опечатке (можете поискать три неправильных кавычки в своем примере).
Цитата
, и печатается всякая хрень wacko.gif .

Да ну? А Вы полагали, что русские литеры в Win кодировке на LCD должны смотреться как-то иначе?

P.S.
И не обзывайте все подряд uint8 - строки есть строки и char это не всегда uint8.
P.P.S.
И const используйте в "естественном" для 'C' порядке с права на лево
и не накладывайте дополнительных ненужных восьмибитовых ограничений на переменные - компилятору не придется городить ненужный код.
void menu_( int x, char const * const *t )


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 7 2007, 07:02
Сообщение #58


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Ну вы прям меня вообще за идиота считаете.
Цитата
Да ну? А Вы полагали, что руссие литеры в Win кодировке на LCD должны смотреться как-то иначе?

Как вы считаете как это будет выглядеть на LCD "1.\x42\x70\x65\xBC\xC7.", //1.Время.
И с чего вы решили, что я напрямую на LCD кидаю.
Цитата
передаются, передаются - не надо диагнозы из пальца высасывать и рефреном повторять

Ничего я не высасывал из пальца, я выводил данные на терминал и портмонитором смотрел, что на него реально приходит.
Цитата
Когда даже в элементарной набивке текста опечатка на опечатке (можете поискать три неправильных кавычки в своем примере).

Я это для примера привёл, если вы страждете получить полный исходник то получите:
Цитата
const uint8 *men0[]=
{
"1.Пункт 1",
"2.Пункт 2
"3.Пункт 3"
};

uint8 menu_(uint8 y, uint8 x, const uint8 **t)
{
uint8 z=0,w,s;
lcd_clr();
lcd_putsf(0,t[x]);
//-----------------------
while(1)
{
if(key_press()) z=read_data_key();
if(z=='2')
{
x++;
if(x>y) x=0;
lcd_clr();
lcd_putsf(0,t[x]);
for(w=0;w<20;w++)
{
//if(!(t[x][w])) break;
s=t[x][w];
u1_putchar(s);
}
u1_putchar(10);
u1_putchar(13);
z=0;
}
if(z=='8')
{
x--;
if(x==0xff) x=y;
lcd_clr();
lcd_putsf(0,t[x]);
z=0;
}
if(z=='6') break;
if(z=='4') {x=255; break;}
}
return x;
}

void main_menu(void)
{
uint8 x=0;
while(1)
{
x=menu_(2,x,men0);
if(x==255) break;
//------------------------------
switch(x)
{
case 0: adj_time(); break;
case 1: adj_time(); break;
case 2: adj_time(); break;
};
//------------------------------
}
}

void adj_time(void)
{
lcd_clr();
lcd_puts(1,"Подменю.");
delay_us(us(1000000));
}

Цитата
И не обзывайте все подряд uint8 - строки есть строки и char это не всегда uint8.

Uint8 это макрос unsigned char.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 7 2007, 08:00
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 7 2007, 10:02) *
Ничего я не высасывал из пальца, я выводил данные на терминал и...

Не знаю куда смотрели, что видели и как увиденное поняли, но для начала просто написать несколько строк без грубых ошибок просто не можете sad.gif
Цитата
...если вы страждете получить полный исходник то получите:

Упаси бог! Зачем он мне? Прочитал первые срочки "полного исходника":
Код
const uint8 *men0[]=
{
"1.Пункт 1",
"2.Пункт 2
"3.Пункт 3"
};

Лучше не стало. Опять ошибка на ошибке - запятые, кавычки, это все типа мелочи. Дальше просто читать не стал. Какой смысл рассуждать о чем-то если компилируют одно, постят другое а думают третье....
Кроме того, повторяю, в приведенном ранее тексте формально все в полном порядке (если не обращать внимания на уже обычные ляпы)
Цитата
Uint8 это макрос unsigned char.

Макрос??? Ну хоть typedef сделайте....
Догадался, только какого лешего его применять для сокрытия естественного типа.

P.S.
В общем я, пожалуй, завязываю.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 7 2007, 08:32
Сообщение #60


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



"2.Пункт 2

Коментарии удалял и удалил лишку. Если вы такой умный моглибы и необращать внимание. А то, что по ссылки валится не те данные которые в строке записанны-это факт.
Повторяю ещё раз. Никого не заставляю мне отвечать. Не хотите не надо.

Цитата
Не знаю куда смотрели, что видели и как увиденное поняли, но для начала просто написать несколько строк без грубых ошибок просто не можете


Выводил в COM PORT на terminal. А так, как терминал отображает символы в определённой кодировке, то параллельно перехватывал работу с портом PORTMONITOR утилитой, и просматривал все значения в hex.

Цитата
Догадался, только какого лешего его применять для сокрытия естественного типа.


А что бы не писать каждый раз UNSIGNED CHAR. (и не говорите что по умалчанию, лучше явно указать, чем при переносе кода в другие места глюки ловить)

не вижу принципиальной разницы между:

typedef unsigned char uint8;

и

#define uint8 unsigned char

Сообщение отредактировал Beginning - Sep 7 2007, 08:15


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 7 2007, 10:59
Сообщение #61


Гуру
******

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



Цитата(Beginning @ Sep 7 2007, 11:32) *
Если вы такой умный моглибы и необращать внимание.
А вы могли бы перед тем как вставить исходный текст в форум откомпилировать его, убедиться что именно этот текст дает именно те ошибки, на которые жалуетесь и уже после этого скопировать прямо из исходника. Мы ведь тоже можем ответить кое-как и совсем про другое - если вы не дурак сами бы поняли.

Цитата(Beginning @ Sep 7 2007, 11:32) *
А что бы не писать каждый раз UNSIGNED CHAR. (и не говорите что по умалчанию, лучше явно указать, чем при переносе кода в другие места глюки ловить)
А почему вы решили, что буква - это unsigned char? До вас все считали, что буква это как раз char, даже специально так тип назвали (загляните в словарь).

Цитата(Beginning @ Sep 7 2007, 11:32) *
не вижу принципиальной разницы между:
typedef unsigned char uint8;
и
#define uint8 unsigned char
Поэтому надо больше читать тематической литературы. Разница есть.

P.S. Ну а я пока тоже завязываю - с таким апломбом вы и сами разберетесь.


--------------------
На любой вопрос даю любой ответ
"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
zltigo
сообщение Sep 7 2007, 12:35
Сообщение #62


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Ладно, на прощание smile.gif.
Цитата(Beginning @ Sep 7 2007, 11:32) *
А что бы не писать каждый раз UNSIGNED CHAR. (и не говорите что по умалчанию, лучше явно указать, чем при переносе кода в другие места глюки ловить)

Вот что-бы глюки "не ловить" и не переопределяйте тип естественный для символьных строк и кучи библиотечных функций с ними работающих.
Цитата
не вижу принципиальной разницы между:
typedef unsigned char uint8;
и
#define uint8 unsigned char

Насколько я мог заметить Вам вообще многое, что без разницы sad.gif, но это не есть объестивная реальность. #define и typedef по разному обрабатываются - один препроцессором, а второй компилятором. Компилятор (или дополнительные утилиты типа lint) могут дополнительно заниматься котролем типов, а препроцессор - нет. Кроме того попробуйте ответить на вопрос есть-ли разница между, например, типами переменных bt и bd:
Код
str_t at, bt;
str_d ad, bd;

если:
Код
typedef char *str_t;   // Правильный подход к делу
#define str_d char *  // Дурной стиль без всякой на то надобности да и еще с побочными эффектами

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 7 2007, 14:13
Сообщение #63


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



За...ца - универсальный интерфейс, через него можно делать всё, что угодно. © biggrin.gif

*ad – ссылка,
bd – char.
Угадал?


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 7 2007, 21:46
Сообщение #64


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Вообщем попотел, но с траблом разобрался. Короче проделал следующие эксперементы:

uint8 *x=10; - глобальная

void funkc(void)
{
uint8 z;
z=x;
….

Смотрю, что в отладчике. Оказывается что что по адресу x лежит адрес не указывающий на адрес расположения 10 (указывал на первый байт после основного кода). A вот так всё OK.

const uint8 *x=10; - глобальная

Та же трабла была и в следующем примере:

const unsigned char *men0[] = {
"1111",
"2222",
"3333",
"4444"
};

и в этом:

unsigned char const *men0[] = {
"1111",
"2222",
"3333",
"4444"
};

и в этом:

unsigned char *men0[] = {
"1111",
"2222",
"3333",
"4444"
};
Т.е. строки в памяти имелись, но массив ссылок на них не ссылался.
А вот с такой конструкцией всё заработало:

unsigned char *const men0[] = {
"1111",
"2222",
"3333",
"4444"
};


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 8 2007, 07:50
Сообщение #65


Гуру
******

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



Цитата(Beginning @ Sep 8 2007, 00:46) *
Короче проделал следующие эксперементы:

unsigned char *const men0[] =
Короче вместо того, чтобы потратить 10 минут на чтение двух глав - про const и про указатели вы потратили кучу времени на метод Монте-Карло, но так ничего и не поняли. А ведь вам подсказывали:
Цитата(zltigo @ Sep 7 2007, 09:43) *
void menu_( int x, char const * const *t )


--------------------
На любой вопрос даю любой ответ
"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
Beginning
сообщение Sep 8 2007, 10:26
Сообщение #66


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Вас затмило ваше сияние и это вы нечего не поняли biggrin.gif . Как раз то, способ передать параметр в функцию ничего не решает. Я использую вот такой: и с ним всё работает:

uint8 menu_(unsigned char *const*t);

Решающим оказывается определение массива ссылок.

Насколько я понял ситуацию, в тех случаях когда код не работал, компилятор создавал не статические ссылки а динамические. Причём, даже динамические ссылки можно инициализировать, и по идеи компилятор должен был это сделать, ан нет, он этого не сделал. Мало того, он даже не выдал ни одного предупреждения о том, что он этого не сделал, и сложилось ложное впечатление о работоспособности кода, хотя на самом деле это было не так.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 8 2007, 10:44
Сообщение #67


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Sep 8 2007, 13:26) *
Вас затмило ваше сияние и это вы нечего не поняли...

smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 8 2007, 11:14
Сообщение #68


Гуру
******

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



Цитата(Beginning @ Sep 8 2007, 13:26) *
Решающим оказывается определение массива ссылок.
Не увидел ни одной ссылки (для справки - в С нет ссылок, они есть в С++). Решающим оказалось, что у вас получились инициализированные неконстантные указатели на константные объекты. Они инициализируются перед запуском функции main(). Если бы вы обдумали упомянутый намек, вы бы сделали массив константных указателей на константные объекты. И они бы были проинициализированны на этапе компиляции.
Цитата(Beginning @ Sep 8 2007, 13:26) *
и по идеи компилятор должен был это сделать, ан нет, он этого не сделал
Не знаю кого затмевает, но у меня подобные конструкции работают как ожидается, и компилятор делает все, что от него хочу 08.gif Может он сделал именно то, что вы попросили, только вы этого не заметили?


--------------------
На любой вопрос даю любой ответ
"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
Beginning
сообщение Sep 8 2007, 12:01
Сообщение #69


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Хорошо указатели. Так в том то и дело, что я хотел этого добится
Цитата
И они бы были проинициализированны на этапе компиляции.

, и добился без посторонней помощи. Привожу пример.

uint8 *const men0[] = {
"1.Настройка времени
"2222",
"3333",
"4444"
};

Где то в функции ставлю следующую конструкцию.

x=*men0[0];

Смотрю дебагер.
x=*men0[0];
00001A08 E59F0068 LDR R0, [PC, #+104] ;[0x1А78] =men0 (0x2978)
00001A0С E5000000 LDR R0, [R0, #+0]

По адресу 0x1A78:

00001A78 00002978

По адресу 00002978 лежит строка.
Так что, адрес 0x1A78 лежит совсем не в изменяемой области памяти, и является ни чем другим, как константой.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post

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

 


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


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