|
|
  |
HI-TECH C |
|
|
|
Oct 25 2008, 11:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 079
Регистрация: 24-06-07
Из: г.Екатеринбург
Пользователь №: 28 654

|
Цитата(DL36 @ Oct 25 2008, 09:01)  Должно быть одинаково если #define _XTAL_FREQ 4MHZ то и Код #define DelayUs(x) { unsigned char _dcnt; \ _dcnt = (((long)(x))*(long)(_XTAL_FREQ))/(long)(12MHZ); \ while(--_dcnt != 0) \ continue; } Вам же символ _ ни к чему. В хайтеке _используется если надо из асма обратиться к сишной переменной. Я пробовал без подчеркивая,хайтек ответил предупреждением,но всё работало.Я подчеркнул,хайтек заткнулся и всё работало. Кстати вольный перевод предупреждения-сейчас не модно пользоваться XTAL_FREQ надо _ XTAL_FREQ
|
|
|
|
|
Oct 25 2008, 12:26
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Евгений Германович @ Oct 25 2008, 15:56)  Я пробовал без подчеркивая,хайтек ответил предупреждением,но всё работало.Я подчеркнул,хайтек заткнулся и всё работало.  Гм... #define XTAL_FREQ не встречается ни в одном стандартном хидере версии std. Этот дефайн поминается только в delay.h в ./samples/... В pro в pic.h есть следующее: Код #pragma inline(_delay) #ifdef __PICCPRO__ extern void _delay(unsigned long); // NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000UL))) #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL))) #endif Могу предположить, что Вы пытаетесь использовать picc std с хидерами от picc pro. Кста, pro корректно раскручивает короткие задержки в nop'ы и goto $+1. Для стд мне приходится держать отдельный delay.c с функциями задержек до 10 тактов (бОльшие задержки считаю идеологически вредными  ), для которого в проектах выключается ассемблерная оптимизация, т.к. оптимизатор asm("nop") оптимизирует напрочь, а от asm("goto $+1") у него крыша съезжает вплоть до следующей }. А конструкция типа volatile asm("...") писсом не поддерживается.  Цитата Кстати вольный перевод предупреждения-сейчас не модно пользоваться XTAL_FREQ надо _ XTAL_FREQ Запостите, плз, предупреждение сюда - даже интересно стало.
|
|
|
|
|
Oct 25 2008, 15:14
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(Евгений Германович @ Oct 25 2008, 16:22)  #warning Preprocessor symbol XTAL_FREQ has been deprecated. Now used _XTAL_FREQ Вот этот текст без варнинга и выскакивает. Странно почему у меня ничего не выскакивает, предупреждения на максимуме компилятор PICC18 std9.51 Цитата Вы заговорили об ассемблерной оптимизации,чем приблизили следующие вопросы У меня при написании асемблерной вставки ХТ жутко ругается на команды использующие адресацию через индексный регистр.Ежли я задаю принудительно адрес с помощью @ то все нормально,а если нет то ...........Оптимизацию я вроде откючил,попытка воткнуть слова bankX воспринимается благосклонно но пользы от восприятия не какой.Не будете ли так любезны прояснить.У меня std9.51 Использование Индексных регистров в асмовких вставках дело тонкое, его надо поделить с компилятором. Но, вот такой текст дает вполне приличный код. Код FSR0L = *( unsigned char *)(&pTable); // FSR0H = *((unsigned char *)(&pTable) +1); WREG = tableOffset0; // tmpMult = PLUSW0; Хайтек очень часто использует FSRx как регистры временного хранения, И может Вы ему чем то помешали. Кстати о страничной организации памяти надо помнить и это теперь Ваша забота.
|
|
|
|
|
Oct 25 2008, 15:49
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Евгений Германович @ Oct 25 2008, 17:22)  #warning Preprocessor symbol XTAL_FREQ has been deprecated. Now used _XTAL_FREQ Вот этот текст без варнинга и выскакивает. В picc std 9.60 такого не замечал. Цитата Вы заговорили об ассемблерной оптимизации,чем приблизили следующие вопросы У меня при написании асемблерной вставки ХТ жутко ругается на команды использующие адресацию через индексный регистр.Ежли я задаю принудительно адрес с помощью @ то все нормально,а если нет то ........... Есть такая непоследовательность в хидерах - INDF определен не для всех контроллеров. Если обращение к INDF происходит в ассемблерных вставках, то необходимо также добавить Код #asm INDF equ 000h #endasm Я, чтобы не париться с этим безобразием, добавил Код static volatile unsigned char INDF @ 0x00; // в ./include/pic*.h и INDF equ 000h; в ./include/as*.h Цитата Оптимизацию я вроде откючил,попытка воткнуть слова bankX воспринимается благосклонно но пользы от восприятия не какой.Не будете ли так любезны прояснить.У меня std9.51 Ничего не понял. Вы бы приводили проблемные куски кода с описанием беды для облегчения процесса. ЗЫЖ ассемблерная оптимизация и ассемблерные вставки никак друг с другом не соотносятся. Но первое - вещь велми полезная, а второе - ... не необходимая.
|
|
|
|
|
Oct 25 2008, 19:17
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Евгений Германович @ Oct 25 2008, 19:59)  про варнинг,сегодня проверял вот текст Код #include "C:\Program Files\HI-TECH Software\PICC-18\STD\9.51\samples\delay\delay.h"; ... __delay_ms(10);
//DelayMs(40); Ругань идет при использовании __delay,Если эту штуку не применять то XTAL_FREQ 13MHZ что с чертой спереди что без -все тихо и спокойно. Воистину, в огороде бузина... Как соотносятся __delay_ms() и DelayMs()? Если Вы пытаетесь использовать DelayMs() из C:\Program Files\HI-TECH Software\PICC-18\STD\9.51\samples\delay\delay.h, то там черным по-Сишному: Код void DelayMs(unsigned char); Если Вы написали свою __delay_ms(), то я, увы, не смог телепнуть ни ее текст, ни ругань по ее поводу. Цитата Меня до неприличия заинтересовал вопро о принудительном определении места в памяти переменных,но как бы я не изголялся с банком -никакого эффекта. Оно Вам точно надо? Код int Abc @ 0x192; // и никаких чудес // если память контроллера нарезана банками по 256 байт, // то Abc попадет в bank1 по смещению 0x92 Abc = 1234; manual.pdf Цитата 3.4.2 Absolute Variables Эта конструкция предназначена в первую очередь для согласования адресов Сишных переменных с регистрами специального назначения микропроцессора, но может быть использована и для размещения переменных пользователя по абсолютным адресам. Компилятор и линкер не производят никаких проверок на перекрытие абсолютных переменных друг с другом. Определение абсолютных переменных может фрагментировать память и сделать невозможным для линкера размещение других объектов. По возможности избегайте использования абсолютных переменных. Если абсолютные переменные все же должны быть определены, старайтесь размещать их в одном конце памяти одним куском. (в оригинале "try to place them at one end of a memory bank or space", но под вечер беда с более точным переводом) Посмотрите любой из хидеров в C:\Program Files\HI-TECH Software\PICC-18\STD\9.51\include - там таким образом описаны все SFR.
|
|
|
|
|
Oct 25 2008, 20:44
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(xemul @ Oct 25 2008, 18:49)  Есть такая непоследовательность в хидерах - INDF определен не для всех контроллеров. Если обращение к INDF происходит в ассемблерных вставках, то необходимо также добавить Это тот случай когда _ помогает. Попробуйте так обратиться _INDF.
|
|
|
|
|
Oct 26 2008, 04:01
|

Профессионал
    
Группа: Свой
Сообщений: 1 079
Регистрация: 24-06-07
Из: г.Екатеринбург
Пользователь №: 28 654

|
Я решил проверить все delay до которых смог дотянуться.  Результат не радует. Воистину, в огороде бузина... Как соотносятся __delay_ms() и DelayMs Воистину, в огороде бузина... неплохо,разница только в том,что DelayMs безбожно врет(По другому сказать правила форума не позволяют,а зря) Оно Вам точно надо? На прямо поставленный вопрос ответ будет подобным-НЕ ЗНАЮ. Но меня огорчила дискриминация со стороны какого то хайтека.Как можно доверить столь интимную вещь,как распределение памяти,какомуто хайтеку,Что он может знать о моих планах на отдаленное будущее. int Abc @ 0x192 Так и я могу.А вы попробуйте просто определить Abc в банк 1 без конкретизации адреса. А как массив в определённый банк записать?? У меня ничего не вышло,этот хт грузит массив в последний банк и нагло плюет на мои просьбы засунуть его в другое место. 3.4.2 Absolute Variables Эта конструкция предназначена в первую очередь для согласования адресов Сишных переменных с регистрами специального назначения микропроцессора, но может быть использована и для размещения переменных пользователя по абсолютным адресам. Компилятор и линкер не производят никаких проверок на перекрытие абсолютных переменных друг с другом. Определение абсолютных переменных может фрагментировать память и сделать невозможным для линкера р У вас,что есть перевод хайтека,если есть не поделитесь? Да бог c INDF. Почему невинная операция incf с использованием банка вызывает такую реакцию ХТ какое его собачье дело,что я собрался делать?Банк естественно был задан перед использованием.
|
|
|
|
|
Oct 26 2008, 07:26
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(Евгений Германович @ Oct 26 2008, 08:01)  Я решил проверить все delay до которых смог дотянуться.  Результат не радует. Воистину, в огороде бузина... Как соотносятся __delay_ms() и DelayMs Воистину, в огороде бузина... неплохо,разница только в том,что DelayMs безбожно врет(По другому сказать правила форума не позволяют,а зря) Оно Вам точно надо? Я не использую программных задержек более 50us для более длинных существуют таймеры. Учитесь использовать RTOS и вопросы задержек отпадут. Цитата На прямо поставленный вопрос ответ будет подобным-НЕ ЗНАЮ. Но меня огорчила дискриминация со стороны какого то хайтека.Как можно доверить столь интимную вещь,как распределение памяти,какомуто хайтеку,Что он может знать о моих планах на отдаленное будущее. int Abc @ 0x192 Так и я могу.А вы попробуйте просто определить Abc в банк 1 без конкретизации адреса. А как массив в определённый банк записать?? У меня ничего не вышло,этот хт грузит массив в последний банк и нагло плюет на мои просьбы засунуть его в другое место. Если честно, то мне по барабану где переменные лежат, это забота компилятора. Цитата 3.4.2 Absolute Variables Эта конструкция предназначена в первую очередь для согласования адресов Сишных переменных с регистрами специального назначения микропроцессора, но может быть использована и для размещения переменных пользователя по абсолютным адресам. Компилятор и линкер не производят никаких проверок на перекрытие абсолютных переменных друг с другом. Определение абсолютных переменных может фрагментировать память и сделать невозможным для линкера р Это можно, но надо ли. Компилятору надо указать, что эти адреса заняты и он туда не полезет. Цитата У вас,что есть перевод хайтека,если есть не поделитесь? Нет, я использую оригинал, что и Вам советую. Цитата Да бог c INDF. Почему невинная операция incf с использованием банка вызывает такую реакцию ХТ какое его собачье дело,что я собрался делать?Банк естественно был задан перед использованием. Не настолько она невинна как кажется, после оптимизации компилятор надеется на то, что в регистрах лежат определённые данные а Вы можете это нарушить. Я показал как можно использовать индексную адресацию не влезая без необходимости в область влияния компилятора. Если хорошо подумать в Си очень многое доступно и без ассемблера. Научившись писать в Си найдете возможность подружить компилятор с ассемблером.
|
|
|
|
|
Oct 26 2008, 13:32
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Евгений Германович @ Oct 26 2008, 08:01)  Я решил проверить все delay до которых смог дотянуться.  Результат не радует. Цитата Воистину, в огороде бузина... Как соотносятся __delay_ms() и DelayMs?
неплохо,разница только в том,что DelayMs безбожно врет(По другому сказать правила форума не позволяют,а зря) Уфф.. Я не знаю, до какой степени безбожно у Вас врет DelayMs(). Мой вопрос был: Цитата Если Вы написали свою __delay_ms(), то я, увы, не смог телепнуть ни ее текст, ни ругань по ее поводу. Точность DelayMs() и DelayUs() я проверял лет 10 тому. С того времени и сами функции в picc std, и их точность ни разу не изменились (а я ими ни разу не воспользовался). DelayUs() на задержках в несколько десятков мкс подвирает больше, чем на сотнях мкс, и это совершенно естественно. Точность DelayMs() примерно соответствует точности внутреннего RC-генератора контроллера. Если у Вас получаются другие результаты, проверьте чистоту эксперимента . Цитата На прямо поставленный вопрос ответ будет подобным-НЕ ЗНАЮ. Но меня огорчила дискриминация со стороны какого то хайтека.Как можно доверить столь интимную вещь,как распределение памяти,какомуто хайтеку,Что он может знать о моих планах на отдаленное будущее. имхо, в большинстве случаев он справится с этой вещью лучше, независимо от Ваших планов. Цитата int Abc @ 0x192 Так и я могу.А вы попробуйте просто определить Abc в банк 1 без конкретизации адреса. А как массив в определённый банк записать?? У меня ничего не вышло,этот хт грузит массив в последний банк и нагло плюет на мои просьбы засунуть его в другое место. Мануалы - рулеззз. Вы только сначала определитесь, какая у Вас версия - pro или std? В любом случае смотрите раздел "Special Type Qualifiers". Вкратце: версии pro (и picc, и picc18) чихают на пожелания программера о рукопашном распределении переменных по банкам, но на квалификаторы bankN не ругаются для совместимости с версиями std (которые удовлетворяют такие пожелания). Цитата У вас,что есть перевод хайтека,если есть не поделитесь? Нет. Я просто перевел кусок для Вас. Про программирование на С без ассемблера: одно и то же можно написать очень по-разному. Попробуйте разные варианты и проанализируйте листинги на предмет разумности и оптимальности этих вариантов. Про знаменитость ht picc: под мелкие пики компиляторов С лет дцать назад было чуть да ничего. Оптимизатор ht picc давал более-менее приличный код по сравнению с другими. У меня просто с тех пор осталась привычка к ht. ЗЫЖ Евгений Германович, неужели, отвечая кому-нибудь в конфе, Вы не замечали парные конструкции, типа quote .. /quote, code .. /code, color .. /color, ..., заключаемые в []? Такие конструкции называются тэгами и придуманы для облегчения и изложения, и восприятия. Ваш способ изложения облегчению восприятия совсем не способствует. Цитата(DL36 @ Oct 26 2008, 00:44)  Это тот случай когда _ помогает. Попробуйте так обратиться _INDF. Мне иногда не лень нарисовать какой-нить .as Поэтому мне проще все хидеры привести к единому виду.
|
|
|
|
|
Oct 26 2008, 14:06
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(xemul @ Oct 26 2008, 17:32)  Мне иногда не лень нарисовать какой-нить .as Поэтому мне проще все хидеры привести к единому виду. Применение _ не приводит ни к какому криминалу. Вариант обращения _INDF в духе и применяется при необходимости обращения к глобальным переменным из асма. Цитата(Евгений Германович @ Oct 26 2008, 12:53)  Это можно, но надо ли. Компилятору надо указать, что эти адреса заняты и он туда не полезет. Как???? Ищите, читайте мануал. Помогает исследование заголовочных файлов Хайтека. В начале применения Си, я также искал и нашёл подобный вариант, но затем отказался от подобной практики, поскольку это связано с проблемами переносимости даже в пределах одного семейства. Первый проект потерян, и поэтому помочь не могу.
|
|
|
|
|
Oct 26 2008, 17:11
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(xemul @ Oct 26 2008, 18:58)  Угу. Но я говорил про ассемблерные файлы, а не про ассемблерные вставки. Повторюсь: мне проще все хидеры привести к единому виду. Так и я про ассемблерные.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|