Перейти к содержанию
    

venomsoldier

Участник
  • Постов

    12
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Спасибо всем откликнувшимся. Написал следующее: #define _SFR(_addr) (*(volatile uint32_t *)_addr) #define MAILBOX_STATUS _SFR(0x2000B898U) #define MAILBOX_WRITE _SFR(0x2000B8A0U) void MailboxWrite(uint32_t val, uint8_t channel) { while(MAILBOX_STATUS&0x80000000); MAILBOX_WRITE=val+channel; } Получил листинг с -O2 void MailboxWrite(uint32_t val, uint8_t channel) { while(MAILBOX_STATUS&0x80000000); 8020: e59f2018 ldr r2, [pc, #24]; 8040 <MailboxWrite+0x20> 8024: e5923898 ldr r3, [r2, #2200]; 0x898 8028: e3530000 cmp r3, #0 802c: bafffffc blt 8024 <MailboxWrite+0x4> MAILBOX_WRITE=val+channel; 8030: e59f3008 ldr r3, [pc, #8]; 8040 <MailboxWrite+0x20> 8034: e0810000 add r0, r1, r0 8038: e58308a0 str r0, [r3, #2208]; 0x8a0 803c: e12fff1e bx lr 8040: 2000b000 .word 0x2000b000 теперь не понятно, для чего он дважды загружает регистр с базовым адресом, получается лишняя строка кода(8030), но уже всё работает верно.
  2. Спасибо огромное. Пока ходил погулять, до меня дошло, перед адресом нужно указать, что это относится к периферии. Для АВРов было что-то вроде _SFR_IO8(0x26) и _SFR_MEM8(0x60). Завтра попробую откомпилить указанный вами код. Еще раз спасибо.
  3. Магические числа - это адреса регистров периферии, при замене их на дефайны ничего не меняется. Покажите пример кода, который бы компилировался правильно. Где написать волитэил?
  4. Начал изучать арм, написал функцию: void MailboxWrite(uint32_t val, uint8_t channel) { while(*((uint32_t *)(0x2000B898))&0x80000000); *((uint32_t *)(0x2000B8A0))=val+channel; } Функция читает регистр статуса по адресу 0x2000B898 и ждет нолика в старшем бите, после этого записывает в 0x2000B8A0 значения. Компилятор версии ARM/GNU C Compiler 4.7.3, шел в комплекте с Atmel Studio 6.1 (папка с именем 4.7.3.1029) Опции компилятора использую следующие: -marm -DBCM2835 -DDEBUG -O0 -ffunction-sections -mlong-calls -g2 -Wall -mcpu=arm1176jzf-s -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" Опции линкера: -marm -nostartfiles -nodefaultlibs -nostdlib -Wl,-Map="$(OutputFileName).map" -Wl,--start-group -lm -Wl,--end-group -L"../cmsis/linkerScripts" -Wl,--gc-sections -mcpu=arm1176jzf-s Компилирую с оптимизацией 0 (-O0), получаю листинг: void MailboxWrite(uint32_t val, uint8_t channel) { 8028: e52db004 push {fp}; (str fp, [sp, #-4]!) 802c: e28db000 add fp, sp, #0 8030: e24dd00c sub sp, sp, #12 8034: e50b0008 str r0, [fp, #-8] 8038: e1a03001 mov r3, r1 803c: e54b3009 strb r3, [fp, #-9] while(*((uint32_t *)(0x2000B898))&0x80000000); 8040: e1a00000 nop; (mov r0, r0) 8044: e59f3028 ldr r3, [pc, #40]; 8074 <MailboxWrite+0x4c> 8048: e5933000 ldr r3, [r3] 804c: e3530000 cmp r3, #0 8050: bafffffb blt 8044 <MailboxWrite+0x1c> *((uint32_t *)(0x2000B8A0))=val+channel; 8054: e59f301c ldr r3, [pc, #28]; 8078 <MailboxWrite+0x50> 8058: e55b1009 ldrb r1, [fp, #-9] 805c: e51b2008 ldr r2, [fp, #-8] 8060: e0812002 add r2, r1, r2 8064: e5832000 str r2, [r3] } 8068: e28bd000 add sp, fp, #0 806c: e8bd0800 pop {fp} 8070: e12fff1e bx lr 8074: 2000b898 .word 0x2000b898 8078: 2000b8a0 .word 0x2000b8a0 Вроде всё работает по плану, только какие-то ненужные манипуляции с sp и fp, вобщем, много лишнего. Компилирую с оптимизацией 1 (-O1), получаю листинг: void MailboxWrite(uint32_t val, uint8_t channel) { while(*((uint32_t *)(0x2000B898))&0x80000000); 8020: e59f301c ldr r3, [pc, #28]; 8044 <MailboxWrite+0x24> 8024: e5933898 ldr r3, [r3, #2200]; 0x898 8028: e3530000 cmp r3, #0 802c: ba000003 blt 8040 <MailboxWrite+0x20> *((uint32_t *)(0x2000B8A0))=val+channel; 8030: e0810000 add r0, r1, r0 8034: e59f3008 ldr r3, [pc, #8]; 8044 <MailboxWrite+0x24> 8038: e58308a0 str r0, [r3, #2208]; 0x8a0 803c: e12fff1e bx lr 8040: eafffffe b 8040 <MailboxWrite+0x20> 8044: 2000b000 .word 0x2000b000 Вот тут лишних манипуляций не происходит, но пропадает цикл while, один раз проверяется статусный бит (802с) и проц уходит в бесконечный цикл (8040). Компилирую с оптимизацией 2 (-O2), получаю листинг: void MailboxWrite(uint32_t val, uint8_t channel) { while(*((uint32_t *)(0x2000B898))&0x80000000); 8020: e59f3018 ldr r3, [pc, #24]; 8040 <MailboxWrite+0x20> 8024: e5932898 ldr r2, [r3, #2200]; 0x898 8028: e3520000 cmp r2, #0 802c: ba000002 blt 803c <MailboxWrite+0x1c> *((uint32_t *)(0x2000B8A0))=val+channel; 8030: e0810000 add r0, r1, r0 8034: e58308a0 str r0, [r3, #2208]; 0x8a0 8038: e12fff1e bx lr 803c: eafffffe b 803c <MailboxWrite+0x1c> 8040: 2000b000 .word 0x2000b000 Тут тоже самое, что и О1, но не происходит перезагрузки регистра с адресом, цикл while так же отсутствует. Компилирую с оптимизацией 3 (-O3), получаю листинг: void MailboxWrite(uint32_t val, uint8_t channel) { 8020: e59f3018 ldr r3, [pc, #24]; 8040 <MailboxWrite+0x20> 8024: e5932898 ldr r2, [r3, #2200]; 0x898 8028: e3520000 cmp r2, #0 802c: aa000000 bge 8034 <MailboxWrite+0x14> 8030: eafffffe b 8030 <MailboxWrite+0x10> while(*((uint32_t *)(0x2000B898))&0x80000000); *((uint32_t *)(0x2000B8A0))=val+channel; 8034: e0810000 add r0, r1, r0 8038: e58308a0 str r0, [r3, #2208]; 0x8a0 803c: e12fff1e bx lr 8040: 2000b000 .word 0x2000b000 Тут уже сразу зацикливается никуда не перепрыгивая (8030) Компиляция с оптимизацией s (-Os), приводит к результату -O2. Еще есть опция -Ofast void MailboxWrite(uint32_t val, uint8_t channel) { 8020: e59f3018 ldr r3, [pc, #24]; 8040 <MailboxWrite+0x20> 8024: e5932898 ldr r2, [r3, #2200]; 0x898 8028: e3520000 cmp r2, #0 802c: aa000000 bge 8034 <MailboxWrite+0x14> 8030: eafffffe b 8030 <MailboxWrite+0x10> while(*((uint32_t *)(0x2000B898))&0x80000000); *((uint32_t *)(0x2000B8A0))=val+channel; 8034: e0810000 add r0, r1, r0 8038: e58308a0 str r0, [r3, #2208]; 0x8a0 803c: e12fff1e bx lr 8040: 2000b000 .word 0x2000b000 Подскажите, как можно ришить мою проблему? Может еще какие опции добавить компилятору? Может я неверно пишу программу??? ))
  5. В форуме математики и физики тему удалили, а здесь никто не отвечает. Куда посоветуете обратиться?
  6. С этим вопросом перенаправили меня из форума математики и физики. Подскажите алгоритмы калибровки и измерения производительности для ленточного дозатора. В составе дозатора имеется тензодатчик на одном из роликов ленты и датчик скорости ленты. Какие есть тонкости при измерениях?
  7. Для освоения и програмирования AVR приобрели JTAGICE3. После многолетней отладки светодиодами и УАРТами на mcs51, работа с JTAGICE3 в AVRStudio5 оставляет только потрясающие впечатления! Для неквалифицированных специалистов очень нужная вещь.
  8. Ситуация такая же, как и у автора ветки. Работал с Атмелами. Установил OpenAT, начинаю Визардом запускать, выбрав Эклипс в качестве IDE, вот, что пишет.. Loading Open AT IDE... Done. Cleaning existing workspaces... Copying Hello_World sample files... Project name : Hello_World Browsing used root libraries list... Browsing used sample libraries list... Browsing local copy list... Browsing provided full paths list... Building Hello_World project settings file... Set project options... Updating flags list... Building no pre-processing include paths table... Building include paths table... Updating Plug-in libraries list... Building source paths table... Updating source paths list... Building source files table... Updating source files list... Building object paths table... Building library paths table... Adding interface files list... Building required IDE workspaces... Updating Hello_World.mak file from Software Common Settings... Done. Updating Hello_World.cdt file from Software Common Settings... mv: cannot stat `.metadata/.plugins/org.eclipse.debug.core/.launches/template.la unch': No such file or directory awk: /cygdrive/c/OpenAT/IDE/IDE/1.04.07/bin/wmtxtpp:39: fatal: cannot open file `.metadata/.plugins/org.eclipse.debug.core/.launches/Hello_World.launch' for rea ding (No such file or directory) awk: /cygdrive/c/OpenAT/IDE/IDE/1.04.07/bin/wmtxtpp:39: fatal: cannot open file `.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml' for rea ding (No such file or directory) awk: /cygdrive/c/OpenAT/IDE/IDE/1.04.07/bin/wmtxtpp:39: fatal: cannot open file `.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.make.core .prefs' for reading (No such file or directory) awk: /cygdrive/c/OpenAT/IDE/IDE/1.04.07/bin/wmtxtpp:39: fatal: cannot open file `.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml' for reading (No such file or directory) Done. Запускается Эклипс, а там пусто... Кто подскажет, что делать?
  9. Не удается запустить AD7731. Данная микросхема используется вкупе с тензодатчиками и 51-м микроконтроллером. Долгое время пытался разшевелить с помощью контролера, затем скачал с сайта AD программу, специально написанную под 7731, но с ней тот же результат. При калибровке никак не меняются значения в регистрах Offset и Gain. Может проблемы не в софте, а в аппаратуре? У кого получилось победить данный продукт, может выложите исходники да схему? Или посоветуете, что необходимо учеть в софте и харде?
×
×
  • Создать...