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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Объектные файлы...
Злодей
сообщение Jun 23 2009, 10:14
Сообщение #1


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

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



WinAVR

Ситуация: пишу тысячу строк кода, например для работы с device, отлаживаю, всё такое, потом отдаю коллеге. Тот должен подключть к своему проекту device.h, написать некоторые функции, зависящие от разводки платы или модификации МК: device_sendbyte(), device_getbyte() и вроде всё.
Код
//файл device.h для работы с device

extern void device_sendbyte( uint8_t byte ); //напиши сам
extern uint8_t device_getbyte( void ); //напиши сам

struct {
    char * name;
    //...
}

int device_some_action();
int device_another_action();


Вроде всё хорошо, но только человеку придётся добавлять в свой проект мои исходники, и они будут у него постоянно make clean -> make all, захламляя и без того неудобочитаемую консоль своими OMG! Warning!

Хочу на выходе что-то самодостаточное, полагаю должно называться device.o и быть объектным файлом.

Я вроде могу превратить исходник в объектный файл, но что потом? Глобальные переменные из модуля, они подружатся сами с init-секциями? А если в нём используется F_CPU, который неизвестен при компиляции модуля? Стоит ли заморачиваться, когда модуль на пару тысяч строк исходников? А как коллега это чудо продукт компиляции к своему проекту должен прикручивать?

Спасибо.

PS Использоваться должно только на atmega.

Сообщение отредактировал Злодей - Jun 23 2009, 10:18
Go to the top of the page
 
+Quote Post
kurtis
сообщение Jun 23 2009, 10:31
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Наверно как-то так http://www.nongnu.org/avr-libc/user-manual/library.html
А отдавать .o файлы это по моему не самая хорошая идея.
Цитата
Вроде всё хорошо, но только человеку придётся добавлять в свой проект мои исходники, и они будут у него постоянно make clean -> make all, захламляя и без того неудобочитаемую консоль своими OMG! Warning!

Зачем постоянно делать "make clean" ? Утилита Make для того и нужна чтоб не компилировать постоянно весь проект заново а только те части которые изменились.
А с предупреждениями компилятора нужно бороться!
Кстати посмотрите как сделан вывод при компиляции примеров из scmRTOS. Удобно и наглядно. Ошибки с предупреждениями сразу бросаются в глаза.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 23 2009, 13:51
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Хорошо написанная программа должна штатно компилиться без единого warning'a...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Jun 23 2009, 14:30
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



А у меня один на ровном месте вылазит smile.gif
Код
...    
for (uchar8 i=0;i<len;i++)
                {...
                buffer[i]= segment_table[*(buffer+i)];
                 ...          
                }


Цитата(Компилятор)
Warning: ...: overflow is possible in 8 bit addition, casting to 'int' may be required


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
Злодей
сообщение Jun 23 2009, 15:04
Сообщение #5


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

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Ребята, ну я же образно.

Сообщение отредактировал Злодей - Jun 23 2009, 15:04
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 23 2009, 15:26
Сообщение #6


Гуру
******

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



Цитата(Goodefine @ Jun 23 2009, 17:30) *
А у меня один на ровном месте вылазит smile.gif

Смею Вас со всей определенностью заверить, что никакого "ровного места" у Вас при таком Warning и близко нет - что-то КРИВО написали стыдливо скрыв за многоточиями. Либо реальная ошибка, либо скажите компилятору с чем он работает.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Jun 24 2009, 06:31
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



Цитата(zltigo @ Jun 23 2009, 18:26) *
...что-то КРИВО написали стыдливо скрыв за многоточиями. Либо реальная ошибка, либо скажите компилятору с чем он работает.

Собственно, там и скрывать то особо нечего, функция предельно проста, в окончательном варианте:
Код
void hard_association(uchar8* buffer,uchar8 len)
{
     uchar8 i;  
     for (i=0;i<len;i++)
                {
                if(buffer[i]<10) buffer[i]= segment_table[*(buffer+i)];
                                 else
                                 buffer[i]=0xBF;                
                #asm("wdr")
                }
}

где
Код
#define DSPL_BUFF_SIZE 5
uchar8 display_buffer[DSPL_BUFF_SIZE];
flash uchar8 segment_table[10]={...};

а сама функция вызывается как:
Код
hard_association(display_buffer, sizeof display_buffer);

Может грабли где-то и есть, но я их пока не вижу...


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 24 2009, 06:46
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Так тоже ругается?
Код
void hard_association(uchar8* buffer,uchar8 len)
{
     uchar8 i;  
     for (i=0;i<len;i++,buffer++)
                {
                *buffer = *buffer<10?segment_table[*buffer]:0xBF;                
                #asm("wdr")
                }
}
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Jun 24 2009, 06:54
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



Так не ругается, но почему ему вариант с индексом не нравится?
P.S.
В, общем, если заменить
Код
...segment_table[*(buffer+i)];

на
Код
...segment_table[buffer[i]];

то Warning исчезает... Хотя в любом Си учебнике написано, что *(buffer+i) <=> buffer[i] ...


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 24 2009, 08:30
Сообщение #10


developer
****

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



Цитата(Goodefine @ Jun 23 2009, 18:30) *
А у меня один на ровном месте вылазит smile.gif
Код
...    
for (uchar8 i=0;i<len;i++)
                {...
                buffer[i]= segment_table[*(buffer+i)];
                 ...          
                }


Я думаю, предупреждение возникает из-за потенциальной опасности при операции сложения.
Предположим
Код
unsigned char i = 254;

i += 10; // вот тут и произошло переполнение


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 24 2009, 09:36
Сообщение #11


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Goodefine @ Jun 24 2009, 10:54) *
Хотя в любом Си учебнике написано, что *(buffer+i) <=> buffer[i] ...
Учебники как правило не обманываютsmile.gif
Так можно ускорить процедуру, убрав из цикла условие...
Код
#define MIN(a,b)  (((a)<(b))?(a):(b))

//=============================================================================
void hard_association(uint8_t* buffer, uint8_t len)
{
    uint8_t i = 0;
    uint8_t n = MIN(len,10);

    for (; i<n; i++)    buffer[i] = segment_table[ buffer[i] ];
    for (; i<len; i++)  buffer[i] = 0xBF;
}
И сбрасывать сторожевой таймер не надо в каждом цикле. У Вас ошибка в логике проектирования программы.
Обычно есть main_task и сторожевой таймер надо сбрасывать именно там (при хорошем стечении обстоятельств ОДИН раз во всей программе).
Есть правило: wdr() распологается в основном теле программы и его выдержка задаётся исходя из сложности этой программы.
Но таймаут 1 секунда - это как правило универсальное решение, за исключением особых случаев.
А лепить wdr() в каждом цикле - ошибка!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Jun 24 2009, 10:10
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



Цитата(demiurg_spb @ Jun 24 2009, 12:36) *
Так можно ускорить процедуру, убрав из цикла условие...

Некоторое ускорение конечно есть (16.6мкс против 20.8мкс), но если учесть, что проверка нужна для предотвращения выхода за пределы массива segment_table его индексов, коими являются числа, лежащие в buffer (иначе говоря, контроль, за предшествующей функцией преобразования buffer-а), то Ваш способ, к сожалению, не работает. А без проверки и так 16.6мкс выходит....
Цитата(demiurg_spb @ Jun 24 2009, 12:36) *
И сбрасывать сторожевой таймер не надо в каждом цикле...

Тут я с Вами соглашусь...


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 24 2009, 10:50
Сообщение #13


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Goodefine @ Jun 24 2009, 14:10) *
Некоторое ускорение конечно есть (16.6мкс против 20.8мкс), но если учесть, что проверка нужна для предотвращения выхода за пределы массива segment_table его индексов, коими являются числа, лежащие в buffer (иначе говоря, контроль, за предшествующей функцией преобразования buffer-а), то Ваш способ, к сожалению, не работает.
Ах да. Я ошибся и понял Ваш алгоритм совсем неверно... XVR предложил хорошее решение...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Jun 24 2009, 11:51
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



Цитата(demiurg_spb @ Jun 24 2009, 13:50) *
...XVR предложил хорошее решение...

Кстати, да. Как это ни странно, асмовский код
Код
for (i=0;i<len;i++,buffer++)  *buffer = *buffer<10?segment_table[*buffer]:0xBF;

выходит несколько короче чем для:
Код
     for (i=0;i<len;i++)  buffer[i]=(buffer[i]<10)? segment_table[buffer[i]]:0xBF;

Хотя, здесь нет buffer++ ...
И что самое интересное, аналог (казалось бы) с тернарным оператором выигрывает у варианта с if-ом (22.2мкс против 33.2мкс(!)). По прежнему ругань по поводу замены buffer[i] на *(buffer+i) и разный результат компиляции... Пути компилятора неисповедимы smile.gif


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Jun 24 2009, 12:08
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(demiurg_spb @ Jun 24 2009, 13:36) *
А лепить wdr() в каждом цикле - ошибка!

Почему, если не секрет? Ошибка ИМХО, если wdr в обработчиках прерываний, в фоне, по-моему, сколько хочешь сбрасывай. Или я ошибаюсь, поясните?
Go to the top of the page
 
+Quote Post

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

 


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


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