prottoss 0 22 октября, 2005 Опубликовано 22 октября, 2005 · Жалоба Да так. Если не сложно не мешаи в ету тему. Как скажешь. Я больше не буду участвовать ни в одной твоей теме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Виктория 0 23 октября, 2005 Опубликовано 23 октября, 2005 · Жалоба To Nikola - все понятно, тогда думаю дальше . Не может быть, что Ваша задача не решаема. To VladislavS в классических системах это делается немного по другому. В теле Вашего прерывания должен находиться переход (call) на адрес расположенный в оперативной памяти (строго фиксировано), где размещается еще один вызов функции (переключение на функцию) адресс которой подставляется (настраивается в данный момент времени) в зависимости от логики работы программы. Так Вы получаете расширение ресурсов своего преравания. Что касается скорости выполнения, то здесь теряется время на дополнительный вызов. На asm это реализуется просто, как это сделать корректно на 'C' - надо подумать. С AVR это не пройдет, так как адресное пространство кода и данных раздельное и сегменты кода во flash лежать обычно. <{POST_SNAPBACK}> Уточните, пожалуйста, вообще нет в системе команд - команд записи в сегменты кода или из-за того, что программа обычно во flash? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Виктория 0 23 октября, 2005 Опубликовано 23 октября, 2005 · Жалоба Вот пример в коде #pragma vector = USART_TXC_vect __interrupt void TXCinterrupt() /// Так должно въиглядет само перервание { pActiv_TXinterrupt_Function(); /// ето указател к функции } А сами функции должно въиглядет так #pragma vector = XXXXXXXX_vect __interrupt Funct1() { ----------- } #pragma vector = XXXXXXXX_vect __interrupt Funct2() { ----------- } сам указател декларирован так void (__interrupt * pActiv_TXinterrupt_Function)(void); Нашел решение которъие работает. pActiv_TXinterrupt_Function въизъиваю из асме. для Funct1,Funct2 ползуюс из векторов перервании которъие не ползуется в програме. Но ето мне не нравится и не хватют свободнъие вектор прерервания <{POST_SNAPBACK}> А зачем переключаемые 8 функций подвешивать на вектора прерываний? Как без asm-вызова обойтись - подумать еще надо :cranky: . А вектора прерываний зачем использовать - разве нельзя указатель на обычную функцию? Или Вы таким образом хотите сохранить те регистры, которые внутри этих функций - непонятно :cranky: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NikolaKirov 0 23 октября, 2005 Опубликовано 23 октября, 2005 · Жалоба А зачем переключаемые 8 функций подвешивать на вектора прерываний? Как без asm-вызова обойтись - подумать еще надо cranky.gif . А вектора прерываний зачем использовать - разве нельзя указатель на обычную функцию? Или Вы таким образом хотите сохранить те регистры, которые внутри этих функций - непонятно cranky.gif Прочтите внимателно что написал DXP когда обяснял разница между нормалние функции и функции перервания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 23 октября, 2005 Опубликовано 23 октября, 2005 · Жалоба Уточните, пожалуйста, вообще нет в системе команд - команд записи в сегменты кода или из-за того, что программа обычно во flash? <{POST_SNAPBACK}> Команда записи в сегмент кода есть - процессор сам себя может перепрограммировать. Но, так как адресные пространства данных и кода раздельные, у контроллера в штатных режимах работы данные в RAM, а код во FLASH. AVR это вам не ARM, зато намного проще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Виктория 0 24 октября, 2005 Опубликовано 24 октября, 2005 · Жалоба Прошу прощения, что вмешиваюсь. Тут все не так и все гораздо проще. IAR делит регистры на local и scratch. Первые - это регистры, которые в вызываемой функции компилятор может использовать только предварительно .... Все остальные "финты ушами" вроде вызова функции через асмовую вставку - это быть самому себе злобным буратиной. В этом случае, когда возникнет прерывание и управление будет передано в функцию, которая не является ISR (т.к. компилятор не знает, что функция эта вызвана асинхронно по отношению к потоку управления), в этой функции будут без ограничений использоваться scratch регистры, значения которых, не будут сохранены (с последующим восстановлением). В результате огребете гору замечательных и труднопресказуемых глюков. Оно надо? Никогда ни в коем случае так делать нельзя. Если уж вызываете функцию без сохранения контекста компилятором, то делайте это сами руками. Такая необходимость может возникнуть при написании переключателя конткестов в вытесняющий RTOS. <{POST_SNAPBACK}> Nikola, я имела в виду, то что подчеркнуто в QUOTE Т.е. если уж Вы все-равно вынуждены использовать asm-вставку, то и делайте в ней сохранение регистров. Плюсы - избавитесь от 8 вынужденно занимаемых векторов прерываний и число сохраняемых регистров при вызове по указателю можно уменьшить (т.е. сохраняются только те регистры, которые действительно используются в 8 переключаемых функций). Минусы - необходимо знать, какие именно это регистры. Это, если решение Вашей задачи на Си окажется невозможным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NikolaKirov 0 24 октября, 2005 Опубликовано 24 октября, 2005 · Жалоба Решил проблем. В фаила \src\template\cfgm16.xcl увеличил -D_..X_INTVEC_SIZE Ето конечно в целости очен некрасивое решение но никто не предложил более приемливъи вариант. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NikolaKirov 0 26 октября, 2005 Опубликовано 26 октября, 2005 · Жалоба Никто ли не знает как ето написат как то нормалнее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 20 декабря, 2005 Опубликовано 20 декабря, 2005 · Жалоба Необходимо переключат функции которъе въизъиваются на перервание. Сделал extern __near void (* pTX_InterruptFunction)(void); а сам interrupt #pragma vector = USART_TXC_vect __interrupt void TXCinterrupt(void) { pTX_InterruptFunction(); } все работает но вот такое генерируется \ 00000000 93BA ST -Y, R27 \ 00000002 93AA ST -Y, R26 \ 00000004 938A ST -Y, R24 \ 00000006 93FA ST -Y, R31 \ 00000008 93EA ST -Y, R30 \ 0000000A 923A ST -Y, R3 \ 0000000C 922A ST -Y, R2 \ 0000000E 921A ST -Y, R1 \ 00000010 920A ST -Y, R0 \ 00000012 937A ST -Y, R23 \ 00000014 936A ST -Y, R22 \ 00000016 935A ST -Y, R21 \ 00000018 934A ST -Y, R20 \ 0000001A 933A ST -Y, R19 \ 0000001C 932A ST -Y, R18 \ 0000001E 931A ST -Y, R17 \ 00000020 930A ST -Y, R16 \ 00000022 B78F IN R24, 0x3F 54 pTX_InterruptFunction(); \ 00000024 .... LDI R26, LOW(pTX_InterruptFunction) \ 00000026 .... LDI R27, (pTX_InterruptFunction) >> 8 \ 00000028 91ED LD R30, X+ \ 0000002A 91FC LD R31, X \ 0000002C 9509 ICALL 55 } \ 0000002E BF8F OUT 0x3F, R24 \ 00000030 9109 LD R16, Y+ \ 00000032 9119 LD R17, Y+ \ 00000034 9129 LD R18, Y+ \ 00000036 9139 LD R19, Y+ \ 00000038 9149 LD R20, Y+ \ 0000003A 9159 LD R21, Y+ \ 0000003C 9169 LD R22, Y+ \ 0000003E 9179 LD R23, Y+ \ 00000040 9009 LD R0, Y+ \ 00000042 9019 LD R1, Y+ \ 00000044 9029 LD R2, Y+ \ 00000046 9039 LD R3, Y+ \ 00000048 91E9 LD R30, Y+ \ 0000004A 91F9 LD R31, Y+ \ 0000004C 9189 LD R24, Y+ \ 0000004E 91A9 LD R26, Y+ \ 00000050 91B9 LD R27, Y+ \ 00000052 9518 RETI И как видно перервание становится медленое. А мои функции совсем простенкие,такое сохранение регистров не нужно. Явно что то не так делаю. Как правилно ето делат? 2 Nikola Kirov Если эта тема вам еще интересна, то сохранение регистров можно отключить используя квалификатор __raw при определении функции обработчика прерывания, или если он не поддерживается вашей версией компилятора можно еще попробовать __noreturn, правда сохранение регистров (если это требуется) тогда ложится на вас... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться