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

 
 
 
Reply to this topicStart new topic
> вопрос к специалистам по CrossWorks, как засунуть биб. функц. в .fast
klen
сообщение Jul 26 2007, 07:36
Сообщение #1


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Решил посмотреть CW.
Возник вопрос. засунуть функцию в рам получается - достаточно объявить ее с атрибутом секции .fast, но из нее вызываются библиотечные вызовы и весь шик пропадает. Можно ли еще линкеру сказать и библовые функции готовит в рам.
Go to the top of the page
 
+Quote Post
klen
сообщение Jul 26 2007, 15:27
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



И че? никто не знает как? или никто не знает что так нельзя сделат?
в кросворке как это сделать я придумал, придумал как ручками наприкрутить к .fast
Go to the top of the page
 
+Quote Post
Alex03
сообщение Jul 30 2007, 05:53
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(klen @ Jul 26 2007, 21:27) *
в кросворке как это сделать я придумал, придумал как ручками наприкрутить к .fast

И?
GCC статическая либа - есть набор объектников. В каждом объектнике описано какоето количество секций, с их именами и данными....
Имена секций в либе видимо не поменять.... Код либ в сегменте типа ".text"...

И каков Ваш метод? Исправить линкерный скрипт так что .text будет по сути как .fast, а свои исходника компилять в какойнить .my_text?
Go to the top of the page
 
+Quote Post
klen
сообщение Jul 31 2007, 20:04
Сообщение #4


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(Alex03 @ Jul 30 2007, 09:53) *
И?
GCC статическая либа - есть набор объектников. В каждом объектнике описано какоето количество секций, с их именами и данными....
Имена секций в либе видимо не поменять.... Код либ в сегменте типа ".text"...

И каков Ваш метод? Исправить линкерный скрипт так что .text будет по сути как .fast, а свои исходника компилять в какойнить .my_text?

ну типа того, только я до этого пожже додумался, сеачала чтандартные либы пересобрал с указаниями секции.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Aug 1 2007, 07:14
Сообщение #5


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



А из чего в кроссворксе пересобираются либы? 07.gif Где исходники-то?

[offtopic]
Цитата(klen @ Aug 1 2007, 00:04) *
сеачала чтандартные

китаец? smile.gif
[/offtopic]


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
klen
сообщение Aug 2 2007, 07:33
Сообщение #6


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(SpiritDance @ Aug 1 2007, 11:14) *
А из чего в кроссворксе пересобираются либы? 07.gif Где исходники-то?

[offtopic]

китаец? smile.gif
[/offtopic]

я libgcc и libm пересобирал, в которых определены элементарные операции (меня интеремовали операции +-/* для флоатов ) и мат функции из libm, после этого можно с посощю ar вкрутить свой собранный код к кросворковскую либу, либо линкеру сказать линковать свои объектники раньше кросворковских - в ld линкует переднюю встреченную версию функции из либов не ругаясь на то что их может быть много в разных либах с которыми линкуется elf.
Таким образом я запустил все медленные функции из флэша, а все что в рабочих циклах (вычисления прилагухи на флоатах), прерывания из озу.
Да тут вариантов мульон! поразному можно сделать. Главно а) научится работать с атрибутами функций и данных в GCC, б) научится работать с ar при cборке либ в) научится работать с ld при сборке сделанного в предыдущих пунктах + разобратся с написание скриптов линкера (я к своему стыду только недавно с этим разобрался практически, раньше както все знал как работает но не возникала необходимость "тюнинга", под AVR вообще не разу в скрипт не заглядывал... )
Go to the top of the page
 
+Quote Post
Мур
сообщение Aug 10 2007, 15:11
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Я из IARа в CW перхожу... Считаю удобнее среду. Столкнулся с дефицитом документации по нему. Опытные товарищи щеголяют атрибутами в стиле а-ля Java.
Никто не даст ссылочку на доку для всех этих нюансов? Примеры... Настройки
Буду благодарен за любую информацию! tort.gif
Спасибо!

Сообщение отредактировал Мур - Aug 10 2007, 15:12
Go to the top of the page
 
+Quote Post
etoja
сообщение Aug 13 2007, 04:14
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



И всётаки прерывания IRQ в Crossworcs отрабатываются неправильно. Даже с заплаткой klena.
Беру LPC2106, разрешаю прерывания от UART0, UART1, TIMER0. Правильно отрабатывает только TIMER0(с заплаткой klena). Без заплатки вообще прерываний нет. Использовал Crossworcs 1.4, 1.6, 1.7.
Компиляция этого же проекта в ICCV7ARM(Imagecraft) и KEIL приводит к правильному результату.

Кстати. Кто-нибудь проверял в Crossworcs опцию
#pragma pack(1)
для выравнивания структур на границу байта?
Go to the top of the page
 
+Quote Post
klen
сообщение Aug 14 2007, 08:09
Сообщение #9


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(etoja @ Aug 13 2007, 08:14) *
И всётаки прерывания IRQ в Crossworcs отрабатываются неправильно. Даже с заплаткой klena.
Беру LPC2106, разрешаю прерывания от UART0, UART1, TIMER0. Правильно отрабатывает только TIMER0(с заплаткой klena). Без заплатки вообще прерываний нет. Использовал Crossworcs 1.4, 1.6, 1.7.
Компиляция этого же проекта в ICCV7ARM(Imagecraft) и KEIL приводит к правильному результату.

Кстати. Кто-нибудь проверял в Crossworcs опцию
#pragma pack(1)
для выравнивания структур на границу байта?


1. Стоп!!! приводим С-код, ассемблерный выход компиллера этого кода (тоесть код обработчиков прерываний которые у вас не работают), версию компиллера. Далее смотрим и возможно изумляемся. У меня все работает, наверно и у Вас должно заработать.

2. Делаю так для выравнивания на 1 байт:
Код
typedef struct
{
  char            Prefix[FRAME_PREFIX_LEN];  
  unsigned int    Id    ;                    
  unsigned char   Source;                    
  unsigned char   Destination;                
  short           Data[FRAME_DATA_COUNT];    
  unsigned char   Cs;                        
}  __attribute__ ((packed)) TMasterFrame;

typedef struct
{
  char            Prefix[FRAME_PREFIX_LEN];  
  unsigned int    Id    ;                      
  unsigned char   Source;                    
  unsigned char   Destination;                
  short           Data[FRAME_DATA_COUNT];  
  short           Sensor[FRAME_SENSOR_COUNT];  
  unsigned char   Cs;                        
}  __attribute__ ((packed)) TSlaveFrame;
Go to the top of the page
 
+Quote Post
andreywz
сообщение Aug 15 2007, 08:19
Сообщение #10





Группа: Новичок
Сообщений: 8
Регистрация: 31-07-07
Пользователь №: 29 482



Цитата(etoja @ Aug 13 2007, 07:14) *
И всётаки прерывания IRQ в Crossworcs отрабатываются неправильно. Даже с заплаткой klena.
Беру LPC2106, разрешаю прерывания от UART0, UART1, TIMER0. Правильно отрабатывает только TIMER0(с заплаткой klena). Без заплатки вообще прерываний нет. Использовал Crossworcs 1.4, 1.6, 1.7.
Компиляция этого же проекта в ICCV7ARM(Imagecraft) и KEIL приводит к правильному результату.

Кстати. Кто-нибудь проверял в Crossworcs опцию
#pragma pack(1)
для выравнивания структур на границу байта?

Насчёт выравниваний могу посоветовать:
typedef struct {
int var1;
int var2;
short var3 __attribute__ ((packed));
short var4 __attribute__ ((packed));
char var5;
}my_type;

my_type myVar;
Если хочется быстрой работы программы и малого размера кода - писать (__attribute__ ((packed))) для всей структуры не надо! Так как при этом она кладётся без выравнивания и загрузка 2 и 4 байтных переменных происходит побайтно.
Я лично выравнивание в структурах контролирую сам. Атрибут packed пишу только напротив short. Такой код правильно компилируется (int грузится ldr, short - ldrh, char - ldrb) и нормально стыкуется с ассемблерными функциями.
Ну а если ресурсы МК безграничны в рамках данного приложения, то пишем либо packed для всей структуры (тогда она кладётся без выравнивания), либо не пишем пакет вовсе (тогда char и short имеют размер 4 байта)
Напротив char писать packed - не надо! (По крайней мере в последних CrossWorks (1.6).

Кстати у меня имеется корыстный вопросик. Лекарство для CrossWorks 1.7 не подкинете?!?

smile.gif smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:42
Рейтинг@Mail.ru


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