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

 
 
> Вопрос по выравниванию адресов, Возможно ли решить???
Paramon
сообщение Aug 1 2007, 11:17
Сообщение #1


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

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Столкнулся с проблемой:
При параметре addrw не кратном 4
при выполнении test = *addrw;
вываливаюсь по адресу 0x00000010

Код
//======код во флеш:
OS_TID TASK8;
unsigned int adres;
......
void    task1(unsigned int addr) __task
    {    
        unsigned int addr0;
        unsigned short test;
        unsigned int * addrw;
        for(;;)
            {
            addr0 = 0;
            while(addr0 < 7)
                {
                    addrw = addr+(addr0*4);
                    test = *addrw;
                    test++;
                    *addrw = test;
                    addr0++;
                };
            };
    }
.......
void    sys_swi_8(unsigned int adr) __swi(8)    //
    {
        adres = adr;
        TASK8 = os_tsk_create_ex(task1,2,adres);
    }
........
//======================




//======= Код загруженный в озу
unsigned short buf_swi[32];

.....
sys_swi_8(&buf_swi);
.....

//========================


Есть ли какая-нибудь возможность при внешнем вызове __SWI /имеется ввиду вызов __SWI, расположенного во флеш из загруженного в ОЗУ модуля, где процедура от SWI обращалась к данным вызвавшего модуля без выравнивания адресов(параметром обмена является только адрес
данных)/?
(Или придётся делать процедуру чтения/записи невыровненых данных?)
Как обьявить выровненый массив не знаю(надо для загружаемого в озу кода).
Хотелось бы иметь не только INT
Примечание: код для флеш и для озу компилируются отдельно
Загрузка в озу из SD/MMC


Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Aug 1 2007, 21:18
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
Вопрос по выравниванию адресов, Возможно ли решить???

Конечно возможно - адреса просто надо выравнивать.

Если читать с невыровнянных адресов, то хотя бы так:

memcpy( &dest, addrw, sizeof( U32 ));

Медленно но, позволит избежать глюков..


Цитата
Сильно сомневаюсь, что чтение невыровненного адреса вызывает дата аборт.

Ну это смотря как MMU настроить, можно и на alignment натравить, часто полезно получается. Запись и чтение "по-тихому" слов с невыровнянных адресов, чреваты страшными глюками.
Go to the top of the page
 
+Quote Post
Paramon
сообщение Aug 2 2007, 04:17
Сообщение #3


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

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Доброго времени суток!
Благодаря вашей помощи всё заработало!!!

У меня по ходу возник другой вопрос:
/с адресами вроде теперь понятно/
Основной модуль(назову его Системой) стартует из пзу самого контроллера.
Подгружаемые в озу модули должны пользоваться функциями и стеком Системы.
Вызываться функции из модулей должны... я думаю так:
Код
....
sys_swi_8("test");
....

их описание:
Код
void    sys_swi_8(unsigned int adr) __swi(8)    //printf
    {
        adres = adr;
        TASK8 = os_tsk_create_ex(task1,2,adres);
    }

сама фунция(здесь пример конечной,но может быть и цикличной):
Код
void    task1(unsigned int addr) __task
    {    

        printf(addr);
        os_tsk_delete_self();
    }


1) сколько штук SWI я могу сделать?
и/или номера фунций указывать одному SWI как параметр?
2) модули пишутся как просто программа (void main(void))
при компиляции у меня (в симуляторе) не происходит старт с main.
/наверное надо делать какой нибудь свой startup/
3) пока не разобрался как размещать их в озу при загрузке из SD/MMC и т.п.
/то, что пыровнять адреса это уже понятно/
4) будут ли они(загр.модули) перемещаемыми?
/можно ли их разместить в произвольном порядке/
5) пока не очень понятно как сделать __task к загруженному модулю.

Спасибо!!!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 23:20
Рейтинг@Mail.ru


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