<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_4_subsect_6_thread_34704"  />
<title>rulinux.net - Форум - Development - [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Форум - Development - [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107883</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107883</guid>
<pubDate>Thu, 22 Sep 2011 12:59:30 +0400</pubDate>
<description><![CDATA[<p>uart.c читать как uart.h </p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107882</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107882</guid>
<pubDate>Thu, 22 Sep 2011 12:58:23 +0400</pubDate>
<description><![CDATA[<p><i>> А теперь покажи определение той самой UART_TxHead и соседней UART_TxTail. И в каких файлах они у тебя определены тоже показывай.</i><br> Бля, спасибо - в правильное место ткнул :) </p><p>Проблема разрешилась - вернул переменные из main (относил их туда попробовать) в uart.cpp, т.е. в uart.c теперь внешние объявления:  <fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1"><li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;  extern volatile unsigned char UART_TxHead;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;</ol></fieldset></p><p>а сами переменные в uart.cpp:</p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1"><li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;  volatile unsigned char UART_TxTail;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;</ol></fieldset></p><p>Результат: скомпилялось и заработало. Вобщем то, что с самого начала пробовал, только вычистил всё что было сгенерировано до этого. Видимо изначально что-то не перекомпилировалось.</p><p></p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107881</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107881</guid>
<pubDate>Thu, 22 Sep 2011 12:23:05 +0400</pubDate>
<description><![CDATA[<p><i>> Подозреваю там и секаса с доступом к переменным не было бы :) Однако хочется avr-gcc.</i><br> Секас будет одинаковый, ибо С. А вот что куда пишется он тебе наглядно в квадратиках покажет.</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107880</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107880</guid>
<pubDate>Thu, 22 Sep 2011 12:21:57 +0400</pubDate>
<description><![CDATA[<p><i>> lds r18, 0x00B3</i><br> Тэээкс. А теперь покажи определение той самой UART_TxHead и соседней UART_TxTail. И в каких файлах они у тебя определены тоже показывай.</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107879</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107879</guid>
<pubDate>Thu, 22 Sep 2011 12:07:20 +0400</pubDate>
<description><![CDATA[<p><i>> s/WinAVR/AvrStudio/;</i><br> Подозреваю там и секаса с доступом к переменным не было бы :) Однако хочется avr-gcc.</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107878</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107878</guid>
<pubDate>Thu, 22 Sep 2011 12:05:39 +0400</pubDate>
<description><![CDATA[<p><i>> Я не увидел у тебя ничего из С++, поэтому не понимаю, зачем ты применяешь компилятор от плюсов для простого кода для Си.</i><br> Ну, мне так захотелось. </p><p><i>> Вот как ты думаешь, что делает вот этот кусок твоего кода:</i><br><i>>> while ( tmphead == UART_TxTail );/* wait for free space in buffer */</i><br> Я думаю, что он ждёт пока освободится буфер. В инлайновой реализации именно это место выкинуто потому что она используется в обработчике прерывания и у неё ни времени ждать нет ни буфер никогда не освободится если прерывания не разрешить, а разрешить их там нельзя. </p><p><i>> И ещё я не понял, где у тебя обозначенный в заголовке "доступ к переменным из соседнего объектного файлика"?</i><br> Пример определения этих переменных я привёл, остальные заданы точно так же. По сути вопроса согласен - скорее правильнее утверждать, что это функции из uart.cpp не там смотрят эти переменные в главной программе. </p><p><i>> И ващё, смотри ассемблерные листинги и бери в руки avr-gdb+simulavr (WinAVR, если религия позволяет) и смотри что у тебя конкретно не так.</i><br> Дык что не так понятно: они в разных местах один и тот же свой буфер ищут. У меня для теста в main.cpp реализована точная копия uart_putc() приведённой выше, называется void test_putc(void), не инлайновая и не использует модификаторов и точно так же не работает - сравнить листинги обеих функций легко - видно что они в разные места смотрят:</p><p> uart_putc(): <fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1"><li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;000004a0 :<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4a0:   20 91 b3 00     lds     r18, 0x00B3<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4a4:   2f 5f           subi    r18, 0xFF       ; 255<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4a6:   2f 71           andi    r18, 0x1F       ; 31<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4a8:   90 91 b4 00     lds     r25, 0x00B4<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4ac:   29 17           cp      r18, r25<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4ae:   e1 f3           breq    .-8             ; 0x4a8 <li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4b0:   e5 eb           ldi     r30, 0xB5       ; 181<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4b2:   f0 e0           ldi     r31, 0x00       ; 0<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4b4:   e2 0f           add     r30, r18<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4b6:   f1 1d           adc     r31, r1<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4b8:   80 83           st      Z, r24<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4ba:   20 93 b3 00     sts     0x00B3, r18<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4be:   55 9a           sbi     0x0a, 5 ; 10<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 4c0:   08 95           ret<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;</ol></fieldset></p><p> test_putc(): <fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1"><li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;0000027a :<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 27a:   20 91 91 00     lds     r18, 0x0091<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 27e:   2f 5f           subi    r18, 0xFF       ; 255<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 280:   2f 71           andi    r18, 0x1F       ; 31<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 282:   90 91 92 00     lds     r25, 0x0092<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 286:   29 17           cp      r18, r25<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 288:   e1 f3           breq    .-8             ; 0x282 <li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 28a:   e3 e9           ldi     r30, 0x93       ; 147<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 28c:   f0 e0           ldi     r31, 0x00       ; 0<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 28e:   e2 0f           add     r30, r18<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 290:   f1 1d           adc     r31, r1<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 292:   80 83           st      Z, r24<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 294:   20 93 91 00     sts     0x0091, r18<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 298:   55 9a           sbi     0x0a, 5 ; 10<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; 29a:   08 95           ret<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;</ol></fieldset></p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107877</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107877</guid>
<pubDate>Thu, 22 Sep 2011 11:43:29 +0400</pubDate>
<description><![CDATA[<p>s/WinAVR/AvrStudio/;</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107876</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107876</guid>
<pubDate>Thu, 22 Sep 2011 11:42:06 +0400</pubDate>
<description><![CDATA[<p><i>> первый вызов штатной ф-ии uart_putc() происходит успешно, а потом инлайновый вызов просто портит память и заканчивается ничем (хотя говорит что в буфер байт отложил успешно), все последующие "нормальные" вызовы так же более не работают.</i><br> И ващё, смотри ассемблерные листинги и бери в руки avr-gdb+simulavr (WinAVR, если религия позволяет) и смотри что у тебя конкретно не так.</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107875</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107875</guid>
<pubDate>Thu, 22 Sep 2011 11:37:41 +0400</pubDate>
<description><![CDATA[<p><i>> Чо не так?</i><br> Я не увидел у тебя ничего из С++, поэтому не понимаю, зачем ты применяешь компилятор от плюсов для простого кода для Си.</p><p><i>> И шрифт тоже хуёвый.</i><br> Ну при чём тут шрифт? Вот как ты думаешь, что делает вот этот кусок твоего кода:</p><p><i>> while ( tmphead == UART_TxTail );/* wait for free space in buffer */</i><br> ? И ещё я не понял, где у тебя обозначенный в заголовке "доступ к переменным из соседнего объектного файлика"?</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107874</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107874</guid>
<pubDate>Thu, 22 Sep 2011 11:13:49 +0400</pubDate>
<description><![CDATA[<p><i>> мало ли вильфред наформатировал</i><br> Там только закрывающая фигурная скобка выпадает за пределы блока code, в целом похоже на правду.</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107873</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107873</guid>
<pubDate>Thu, 22 Sep 2011 11:11:37 +0400</pubDate>
<description><![CDATA[<p><i>> Укурок, чтоли? Замени на .c и не насилуй свой проц.</i><br> Чо не так?</p><p><i>> Читай ман про ключевое слово static.</i><br> Да пох, без static оно тоже не работает.</p><p><i>> Про extern тоже не помешает прочесть. И код у тебя какой-то странный, каша какая-то</i><br> И шрифт тоже хуёвый. Соображения по существу какие-нибудь есть?</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107872</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107872</guid>
<pubDate>Thu, 22 Sep 2011 10:56:17 +0400</pubDate>
<description><![CDATA[<p><i>> extern void uart_putc(unsigned char data);</i><br> Про extern тоже не помешает прочесть. И код у тебя какой-то странный, каша какая-то (к форматированию это не относится, хотя всё равно скинь на какой-нибудь пастебин, а то мало ли вильфред наформатировал).</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107871</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107871</guid>
<pubDate>Thu, 22 Sep 2011 10:49:55 +0400</pubDate>
<description><![CDATA[<p><i>>  <b>static</b> inline bool uart_putc_nowait(unsigned char data)</i><br> Читай ман про ключевое слово static.</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107870</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107870</guid>
<pubDate>Thu, 22 Sep 2011 10:48:33 +0400</pubDate>
<description><![CDATA[<p><i>> uart.cpp</i><br> Укурок, чтоли? Замени на .c и не насилуй свой проц.</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107869</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107869</guid>
<pubDate>Thu, 22 Sep 2011 10:46:35 +0400</pubDate>
<description><![CDATA[<p>подправил как мог</p>]]></description>
</item>
<item>
<title>Re: [AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107868</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107868</guid>
<pubDate>Thu, 22 Sep 2011 10:37:43 +0400</pubDate>
<description><![CDATA[<p>Блядь.. Туксоед мы чо, уже на новом движке? Чо с форматированием кода?</p>]]></description>
</item>
<item>
<title>[AVR-GCC] Проблемы с доступом к переменным из соседнего объектного файлика</title>
<link>https://rulinux.net/message.php?newsid=34704&amp;page=1#107867</link>
<guid>https://rulinux.net/message.php?newsid=34704&amp;page=1#107867</guid>
<pubDate>Thu, 22 Sep 2011 10:35:00 +0400</pubDate>
<description><![CDATA[<p>Есть библиотечка для работы с UART'ом, состоящая из двух файлов с uart.h и uart.cpp В uart.h как водится дефиниции располагаются, например: </p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1"><li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;extern volatile unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;...<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;extern void uart_putc(unsigned char data);<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;</ol></fieldset></p><p>А в uart.cpp, соответственно, имплементация: </p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1"><li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;void uart_putc(unsigned char data)<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;{<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    unsigned char tmphead;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    tmphead  = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    while ( tmphead == UART_TxTail );/* wait for free space in buffer */<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    UART_TxBuf[tmphead] = data;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    UART_TxHead = tmphead;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    /* enable UDRE interrupt */<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    UART0_CONTROL    |= _BV(UART0_UDRIE);<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;</ol></fieldset>/* uart_putc */</p><p>}</p><p>Всё работает просто зашибись.</p><p>Теперь я хочу вышеприведённую функцию сделать инлайновой. Для этого пишу в uart.h следующее:</p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1"><li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;static inline bool uart_putc_nowait(unsigned char data){<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    unsigned char tmphead = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    if(tmphead == UART_TxTail) return false; // do NOT wait for free space in buffer<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    UART_TxBuf[tmphead] = data;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    UART_TxHead = tmphead;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    // enable UDRE interrupt<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    UART0_CONTROL    |= _BV(UART0_UDRIE);<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;    return true;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;</ol></fieldset></p><p> }    И делаю тестовую программку, которая инициализирует UART и поочереди выводит буквы то старым то новым способом. </p><p>Копулятор успешно программку копулирует, но вот при исполнении полученного бинарника оказывается, что первый вызов штатной ф-ии uart_putc() происходит успешно, а потом инлайновый вызов просто портит память и заканчивается ничем (хотя говорит что в буфер байт отложил успешно), все последующие "нормальные" вызовы так же более не работают.           Есть мнение что avrgcc почему-то генерит объектный код для main.cpp (откуда вызываются putc-функции) и uart.cpp с разными адресами для буфера и сопутствующих переменных и при линковке это нихера не выравнивается. Вот выдержка из map-файла: </p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1"><li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;...<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;.data           0x0000000000800060        0xc load address 0x0000000000000510<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;                0x0000000000800060                PROVIDE (__data_start, .)<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; *(.data)<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; .data          0x0000000000800060        0x0 /usr/lib/gcc/avr/4.5.3/../../../../avr/lib/crts4433.o<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; .data          0x0000000000800060        0x0 ./config.o<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; .data          0x0000000000800060        0x0 ./intervalometer.o<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; .data          0x0000000000800060        0xc ./main.o<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; .data          0x000000000080006c        0x0 ./utl.o<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp; .data          0x000000000080006c        0x0 ./lib/uartlib/uart.o<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;...<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;</ol></fieldset>   </p><p>Вопрос - как заставить инлайн работать?</p>]]></description>
</item>
</channel>
</rss>