|
|
  |
eCos, open-source RTOS |
|
|
|
Jan 31 2005, 07:50
|
Группа: Новичок
Сообщений: 8
Регистрация: 27-01-05
Пользователь №: 2 222

|
Случайно наткнулся на данный форум. Сейчас я как раз занимаюсь сборкой eCos для платформы на базе LPC2294. У меня есть два вопроса : 1. Мне необходима возможность дистанционного обновления образа eCos. Соответственно вопрос RedBoot продолжает функционировать при запуске eCos? Так же непонятен процесс автоматичекого запуска Redboot-ом операционнки. 2. У меня следующая проблема RedBoot или приложение (например ping_test)откомпилированное с операционкой, запускаются исключительно с внутренней flash (стартовый адресс 0). Похоже у меня проблема с векторами прерываний, но как их изменить я не знаю. Буду благодарен за любой совет.
|
|
|
|
|
Jan 31 2005, 08:53
|

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

|
RedBoot нужен только на период отладки - основные его задачи - при старте привести контроллер в рабочее состояние (чипселекты, вайтстейты, внутренние регистры, вектора) и выйти на связь с GDB (точнее, запустить stub GDB) - и все, дальше стабом грузится ваша задача (это может быть и eCos собранный с прикладной задачей), и передается управление задаче, правда с учетом присутствия отладчика - вектора прерываний перенаправлены.
Касательно места загрузки вашей задачи - это определяется в скрипте для линкера - в дистрибутиве системы - в packages/hal найдите вашу платформу, и там в include/pkgconf файлы *.h,*.lda,*.mlt для каждого варианта генерации (rom, ram, ronram) описывают модель памяти - можно подредактировать их, а можно и в сгенерированной системе - я делаю просто, *.ld стираю, а редактирую *.ldi соответствущий, после чего он make-ом восстанавливается (ldi проще).
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Jan 31 2005, 11:14
|
Группа: Новичок
Сообщений: 8
Регистрация: 27-01-05
Пользователь №: 2 222

|
mlt_xxx.h и mlt_xxx.ldi файлы я редактирую, также изменяю значение HAL_PLATFORM_RESET_ENTRY, но это почему то не помогает. Не зависимо от выбранного варианта запуска программа переходит на на 0-вые адреса. Попутно хотелось бы задать следующий вопрос: В RedBoot я использую ethernet контроллер. При запуске приложения в котором не используется ethernet всё работает. Для примера:
+... waiting for BOOTP information Ethernet eth0: MAC address 08:88:12:34:56:78 IP: 10.0.0.41/255.255.252.0, Gateway: 10.0.0.5 Default server: 10.0.1.10
RedBoot bootstrap and debug environment [ROM] Non-certified release, version UNKNOWN - built 15:57:02, Jan 27 2005
Platform: ALBATROS MP9 PLC board (ARM7TDMI-S) Copyright © 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
RAM: 0x81000000-0x81200000, [0x8100a0a0-0x811ed000] available FLASH: 0x80000000 - 0x80400000, 64 blocks of 0x00010000 bytes each. == Executing boot script in 5.000 seconds - enter ^C to abort *[cyg_net_init] Init: mbinit(0x00000000) [cyg_net_init] Init: cyg_net_init_devs(0x00000000) Init device 'cs8900a_eth0' [cyg_net_init] Init: loopattach(0x00000000) [cyg_net_init] Init: ifinit(0x00000000) [cyg_net_init] Init: domaininit(0x00000000) [cyg_net_init] Init: cyg_net_add_domain(0x81000ca4) New domain internet at 0x00000000 [cyg_net_init] Init: cyg_net_add_domain(0x81000774) New domain route at 0x00000000 [cyg_net_init] Init: call_route_init(0x00000000) [cyg_net_init] Done Hello, eCos world!
Если в приложение добавить: int main(void) { printf("Hello, eCos world!\n"); /////////////////////////////////////////////// init_all_network_interfaces(); while(1); }
То при вызове init_all_network_interfaces(); просходит перезапуск программы. Хотя если нет Redboot всё работает без проблем (правда тогда прложение находится во внутренней flash).
Может здесь присутствует какая то общая ошибка (моя естественно)?
|
|
|
|
|
Jan 31 2005, 15:27
|
Группа: Новичок
Сообщений: 8
Регистрация: 27-01-05
Пользователь №: 2 222

|
Сделал дизассемблер и обнаружил следующюю вещь:
Disassembly of section .rom_vectors:
80000000 <__exception_handlers>: 80000000: ea00000e b 80000040 <_stext> 80000004: e59ff018 ldr pc, [pc, #24] ; 80000024 <.undefined_instruction> 80000008: e59ff018 ldr pc, [pc, #24] ; 80000028 <.software_interrupt> 8000000c: e59ff018 ldr pc, [pc, #24] ; 8000002c <.abort_prefetch> 80000010: e59ff018 ldr pc, [pc, #24] ; 80000030 <.abort_data> 80000014: 00000000 andeq r0, r0, r0 80000018: e59ff018 ldr pc, [pc, #24] ; 80000038 <.IRQ> 8000001c: e59ff018 ldr pc, [pc, #24] ; 8000003c <.FIQ>
00000000 <__exception_handlers>: 0: ea00000e b 40 <_stext> 4: e59ff018 ldr pc, [pc, #24] ; 24 <armreg_r9> 8: e59ff018 ldr pc, [pc, #24] ; 28 <armreg_r10> c: e59ff018 ldr pc, [pc, #24] ; 2c <armreg_fp> 10: e59ff018 ldr pc, [pc, #24] ; 30 <armreg_ip> 14: 00000000 andeq r0, r0, r0 18: e59ff018 ldr pc, [pc, #24] ; 38 <armreg_lr> 1c: e59ff018 ldr pc, [pc, #24] ; 3c <armreg_pc>
Как видно описание переходов абсолютно одинаковое. Кто нибудь знает -- у LPC22xx счетчик команд равен при попадании на вектор равен 0 или адресу собласти на которую производится mapping.
|
|
|
|
|
Jan 31 2005, 16:34
|
Группа: Новичок
Сообщений: 8
Регистрация: 27-01-05
Пользователь №: 2 222

|
Если бы я умел им пользоваться.......
|
|
|
|
|
Feb 1 2005, 06:01
|
Группа: Новичок
Сообщений: 8
Регистрация: 27-01-05
Пользователь №: 2 222

|
Спасибо за информацию, сейчас буду разбираться.
|
|
|
|
|
Mar 14 2008, 09:52
|
Частый гость
 
Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167

|
Простой поиск показывает, что ... Код grep -r CPSR_USER_MODE ./ ./hal/arm/arch/current/src/hal_mk_defs.c: DEFINE(CPSR_USER_MODE, CPSR_USER_MODE); ./hal/arm/arch/current/src/vectors.S: cmp r2, #CPSR_USER_MODE ./hal/arm/arch/current/src/vectors.S: cmp r2, #CPSR_USER_MODE ./hal/arm/arch/current/src/vectors.S: cmp r2, #CPSR_USER_MODE ./hal/arm/arch/current/include/hal_arch.h:#define CPSR_USER_MODE 0x10 ./hal/arm/arch/current/ChangeLog: * include/hal_arch.h: Defined CPSR_USER_MODE. ./hal/arm/arch/current/ChangeLog: * src/hal_mk_defs.c.: Added definition for CPSR_USER_MODE. CPSR_USER_MODE объявлен в hal_arch.h и просто не может быть undeclared при корректной сборке для ARM. Наверно ошибки в конфигурировании. Пока посоветовать ничего не могу, есть только вопросы. Как вы конфигурируете ecos? Какие пакеты входят в конфигурацию? Какой компилятор? Windows или linux? Про ecos 2.0 забудьте. Это старье. Не думаю, что оттуда стоит что-то копировать.
|
|
|
|
|
Mar 16 2008, 11:33
|
Частый гость
 
Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906

|
Спасибо за ответ. Вроде все нормально. Похоже, это был глюк с самим конфигтулом. Надо было, видимо, каждую новую конфигурацию под новым именем сохранять. А компилим под Линуксом. Ещё вопрос: Подскажите, пожалуйста, как написать простую программу зажигания светодиода на плате AS-Sam7x (мк AT91SAM7x256), используя функции eCos. Вроде собрали библиотеки для eCos (конфигурация default или minimal), в качестве template выбрали AT91SAM7x-EK. Скомпилировали пример (к-рый с платой поставлялся) вместе с полученными библиотеками. Бинарник прошили в мк, но, конечно, ничего не заморгало(этот пример ведь не для eCos). Где можно функции eCosовские посмотреть или может, примерчик есть у кого-нить простой?
|
|
|
|
|
Mar 17 2008, 04:23
|
Частый гость
 
Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167

|
Цитата(ZAA @ Mar 16 2008, 17:33)  Где можно функции eCosовские посмотреть или может, примерчик есть у кого-нить простой?  Примеров полно в самом репозитарии ecos. Соберите тесты (есть практически для всех пакетов) или посмотрите директорию examples. Все примеры осуществляют вывод в консоль, поэтому проверить работоспособность легко. Светодиод в ecos можно зажечь также как и в программе для МК без ОС, т.е. записать значение в порт. Ну разве, что принято использовать для этого макросы HAL_WRITE_UINT32 и HAL_READ_UINT32. Тут уже читайте документацию.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|