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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> eZ430-F2013, впечатления
VVlad
сообщение Dec 31 2009, 10:22
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



В Документе MSP430x2xx_Family_User's_Guide_(Rev._D)_slau144d.pdf на странице 6-2 в главе про работу с DMA (Direct Memory Access) - (подозреваю, что перевод "пропускная память директора" не совсем точен). Указано ясно - использование DMA контролёра, передающего данные из одного адреса в другой (типа почтальон), без вмешательства ЦПУ может передавать данные конверсии АЦП в оперативную память.
(The direct memory access (DMA) controller transfers data from one address
to another, without CPU intervention, across the entire address range. For
example, the DMA controller can move data from the ADC12 conversion
memory to RAM.)
Отсюда вопрос - значит ли это, что если использовать DMA, то это позволить ужать код на ассемблере до заветных 1 кб, чтобы поместилось на флеш? Другими словами, при удобствах DMA не сильно ли он усложняет-расширяет код?
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 31 2009, 18:51
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А где вы увидели модуль DMA в MSP430F2013? В User's Guide описана вся имеющаяся в кристаллах данного семейства периферия. Но какая именно периферия имеется в данном конкретном кристалле нужно смотреть в его datasheet.
Go to the top of the page
 
+Quote Post
VVlad
сообщение Jan 11 2010, 07:24
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



С прошедшими (наконец с облегчением-спасибо Господи, пережили!) праздниками поздравляю всех дорогих форумчан. Пользуясь знаменательной датой (11 января - день "спасибо") благодарю за помощь.
Подозреваю, мои проблемы были с тем, что тип микроконтроллера, используемый мною - MSP430F2012. Взятый же из книга пример - "Под " ’149 device" имеется в виду тип микроконтроллера - MSP430F149."
Переписал на ассемблере, вот что получилось:
Код
MOV "00110", ADC12CTL1



Цитата(rezident @ Dec 31 2009, 21:51) *
А где вы увидели модуль DMA в MSP430F2013? В User's Guide описана вся имеющаяся в кристаллах данного семейства периферия. Но какая именно периферия имеется в данном конкретном кристалле нужно смотреть в его datasheet.


Уважаемый Резидент, спасибо за участие, на странице 18 документа "SLAS491A -- August 2005 - Revised October 2005"
приведено следующее -


ADC10 (MSP430x20x2 only)
The ADC10 module supports fast, 10-bit analog-to-digital conversions. The module implements a 10-bit SAR
core, sample select control, reference generator and data transfer controller, or DTC, for automatic conversion
result handling allowing ADC samples to be converted and stored without any CPU intervention.

Implements - я понял как "выполнять, осуществлять, обеспечивать выполнение".

That's why I hope to use DTC as trivial form of DMA.
Go to the top of the page
 
+Quote Post
VVlad
сообщение Jan 11 2010, 17:20
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Извините за ошибочные дубликаты - глючила связь.

Подскажите, пожалуйста, почему на следующие простые команды компилятор ругается
вот так
Error[446]: Number out of range. Valid range is -32768 (-0x8000) to 65535 (0xFFFF). C:\Documents and Settings\vlad\Мои документы\IAR Embedded Workbench\temper-prj\asm.s43 17

Ведь если перевести из двоичного вида в десятичный, получим 3338, что укладывается не только в диапазон -32768 до 65535, но и в диапазон (-8000 до FFFF в шестнадцатеричном представлении).
Код
#include "msp430x20x2.h"                    ; #define controlled include file

EDE     ORG     01B0h
        MOV.W   #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
        MOV.W   #011001100111000,EDE   ; Настройка первого управляющего АЦП
        MOV.W   #101000100000010,EDE+1 ; Настройка второго управляющего АЦП
        MOV.W   #011001100111000,EDE   ; Разрешить и запустить преобразование
                                       ; (endless loop)
        END
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 11 2010, 20:13
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(VVlad @ Jan 11 2010, 12:24) *
That's why I hope to use DTC as trivial form of DMA.
Эта оговорка совершенно справедливая, DTC это не полноценный DMA.
Цитата(VVlad @ Jan 11 2010, 22:20) *
Подскажите, пожалуйста, почему на следующие простые команды компилятор ругается
вот так
Error[446]: Number out of range. Valid range is -32768 (-0x8000) to 65535 (0xFFFF). C:\Documents and Settings\vlad\Мои документы\IAR Embedded Workbench\temper-prj\asm.s43 17
Потому, что #011001100111000 это десятичное число, а не двоичная запись числа. Символ # в записи указывает на способ адресации аргумента - непосредственная адресация, а вовсе не на двоичную форму записи этого числа. Двоичные числа в ассемблере IAR начинаются с префикса b или заканчиваются суффиксом b. Смотрите EW430_AssemlerReference.pdf из комплекта документации IAR.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
VVlad
сообщение Jan 12 2010, 12:07
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Цитата(rezident @ Jan 11 2010, 23:13) *
Эта оговорка совершенно справедливая, DTC это не полноценный DMA.
Потому, что #011001100111000 это десятичное число, а не двоичная запись числа. Символ # в записи указывает на способ адресации аргумента - непосредственная адресация, а вовсе не на двоичную форму записи этого числа. Двоичные числа в ассемблере IAR начинаются с префикса b или заканчиваются суффиксом b. Смотрите EW430_AssemlerReference.pdf из комплекта документации IAR.

Благодарю за снисходительность к моему дремучему невежеству и особое спасибо за точный исчерпывающий ответ.
Обнаружил только что, есть файл msp430.h в папке X:\430\inc\, со ссылкой на файл msp430x20x2.h, где
абсолютным адресам управляющих регистров присвоены псевдонимы

Код
#define ADC10DTC0_          (0x0048)    /* ADC10 Data Transfer Control 0 */
DEFC(   ADC10DTC0         , ADC10DTC0_)
#define ADC10DTC1_          (0x0049)    /* ADC10 Data Transfer Control 1 */
DEFC(   ADC10DTC1         , ADC10DTC1_)


Можно ли использовать их вместо абсолютных адресов, например, так

Код
  
        MOV.W   #WDTPW+WDTHOLD,&WDTCTL; Stop watchdog timer
        MOV.W   #011001100111000b,ADC10DTC0_  ; Настройка первого управляющего АЦП
        MOV.W   #101000100000010b,ADC10DTC1_; Настройка второго управляющего АЦП
        MOV.W   #011001100111011b,ADC10DTC0_  ; Разрешить и запустить преобразование


Простите за ещё один глупый вопрос, но что означает символ подчёркивания, обязателен ли он (в функции DEFC два аргумента - первый без подчеркивания, второй - с ним)?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 12 2010, 19:57
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(VVlad @ Jan 12 2010, 17:07) *
Можно ли использовать их вместо абсолютных адресов
При подключении соответствующего хедера использовать можно, но не рекомендуется. TI настойчиво рекомендует везде использовать стандартные символьные обозначения битов и регистров. Именно те, которые во всей документации TI упоминаются. Эти стандартные обозначения как раз в хедерах msp430xXXX.h прописаны. Хедеры с именами io430xXXX.h это аналогичное изделие, но от IAR. В заголовках хедеров обычно указано, кто их автор. Откройте в любом текстовом редакторе и посмотрите.
Цитата(VVlad @ Jan 12 2010, 17:07) *
Простите за ещё один глупый вопрос, но что означает символ подчёркивания, обязателен ли он (в функции DEFC два аргумента - первый без подчеркивания, второй - с ним)?
Подчеркивание введено для того, чтобы различать стандартные символьные обозначение регистров и их "подстановочные" имена, используемые в макросах IAR. Как я уже написал выше, использовать следует именно стандартные символьные имена, которые без подчеркиваний в конце или начале.
Кстати, ваша запись некорректная. Вы использовали символьный способ адресации, вместо абсолютного. В результате константы в трех последних командах будут загружены совсем не по тому адресу, которому вы предполагаете. Читайте внимательно описание способов адресации операндов и их символьного обозначения в User's Guide. Вот тут на русском есть.
Go to the top of the page
 
+Quote Post
VVlad
сообщение Jan 13 2010, 08:22
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Цитата(rezident @ Jan 12 2010, 22:57) *
При подключении соответствующего хедера использовать можно, но не рекомендуется. TI настойчиво рекомендует везде использовать стандартные символьные обозначения битов и регистров. Именно те, которые во всей документации TI упоминаются. Эти стандартные обозначения как раз в хедерах msp430xXXX.h прописаны. Хедеры с именами io430xXXX.h это аналогичное изделие, но от IAR. В заголовках хедеров обычно указано, кто их автор. Откройте в любом текстовом редакторе и посмотрите.
Подчеркивание введено для того, чтобы различать стандартные символьные обозначение регистров и их "подстановочные" имена, используемые в макросах IAR. Как я уже написал выше, использовать следует именно стандартные символьные имена, которые без подчеркиваний в конце или начале.
Кстати, ваша запись некорректная. Вы использовали символьный способ адресации, вместо абсолютного. В результате константы в трех последних командах будут загружены совсем не по тому адресу, которому вы предполагаете. Читайте внимательно описание способов адресации операндов и их символьного обозначения в User's Guide. Вот тут на русском есть.

В результате искренних и страстных попыток понять управление встроенным в MSP430F2012 АЦП (ADC10) сложилось впечатление, что не стоит выключать сторожевой таймер, настроить его на 100 мсек, загрузить контрольные регистры (250 мксек), запустить 16-кратную выборку (0.8 мсек), преобразование (100 мкс), посредством DTC заполнить память, выполнить усреднение (0.9 мсек), передать результат в порт вывода и уйти в спящий режим (на 97 мсек) до перезапуска от сторожевого таймера.

Относительно хедер-файлов разобрался, символ подчёркивания как признак "макросной подстановочности" осознал,
в любезно предоставленном Вами "ЮГ"-е есть фраза "В большинстве примеров показаны схожие режимы адресации для источника и получателя, но в команде возможны любые правильные комбинации способов адресации источника и получателя." после таблицы 3.3 перед замечанием о EDE и TONI.
Значит ли это, что допустимо совместить в одной команде кода ассемблера прямой режим для первого операнда (вместо #011001100111000b возможно эквивалентное #3338h)-источника с абсолютным режимом (&01B0h) для второго операнда - получателя?
Код
EDE     ORG     01B0h
        MOV.W   #WDTPW+WDTHOLD,&WDTCTL; Stop watchdog timer
        MOV.W   #3338h,&EDE  ; Настройка первого управляющего АЦП

Кстати по адресу http://focus.ti.com/mcu/docs/mcuprodcodeex...&tabId=1468
мне посчастливилось скачать файловый архив из http://www.ti.com/lit/zip/slac080,
где в файле msp430x20x2_adc10_01.asm
загрузка контрольных регистров в АЦП выглядит просто сказочно:
Код
.cdecls C,LIST,  "msp430x20x2.h"

;------------------------------------------------------------------------------
            .text                          ; Progam Start
;------------------------------------------------------------------------------
RESET       mov.w   #0280h,SP              ; Initialize stackpointer
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
SetupADC10  mov.w   #ADC10SHT_2+ADC10ON+ADC10IE,&ADC10CTL0; 16x, enable int.

Если концепция верна, то здесь первый операнд адресуется то ли прямым режимом (признак - есть символ решётки #),
то ли символьным (есть псевдонимы типа ADC10SHT_2). Или от нас скрывают какоё-то восьмое чудо света-режим комбинированный прямо-символьный? Стыдно признаться, но не могу понять. Помогите пожалуйста разобраться.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 14 2010, 09:28
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(VVlad @ Jan 13 2010, 13:22) *
уйти в спящий режим (на 97 мсек) до перезапуска от сторожевого таймера.
Зачем перезапуск-то нужен? Используйте WDT в режиме интервального таймера, который вызывает установку флага WDTIFG и прерывание с тем же периодом, а не полный рестарт программы. Прерывание "разбудит" ядро. А все ваши программные действия можно выполнить внутри обработчика прерывания, либо выполнить команду, выводящую ядро из спячки. Программа при этом должна быть зациклена в бесконечный цикл.
Цитата(VVlad @ Jan 13 2010, 13:22) *
Значит ли это, что допустимо совместить в одной команде кода ассемблера прямой режим для первого операнда (вместо #011001100111000b возможно эквивалентное #3338h)-источника с абсолютным режимом (&01B0h) для второго операнда - получателя?
Да, допустимо.
Цитата(VVlad @ Jan 13 2010, 13:22) *
Если концепция верна, то здесь первый операнд адресуется то ли прямым режимом (признак - есть символ решётки #),
то ли символьным (есть псевдонимы типа ADC10SHT_2). Или от нас скрывают какоё-то восьмое чудо света-режим комбинированный прямо-символьный?
В вашем примере символьные обозначения битов, которые суммируются (+) в константу препроцессором. А константа в свою очередь адресуется непосредственным (#) образом, то бишь располагается в памяти непосредственно сразу вслед за кодом операнда.
Go to the top of the page
 
+Quote Post
VVlad
сообщение Jan 14 2010, 12:58
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Резидент, Ваши ответы поразительным образом сочетают в себе глубокий профессионализм с доступностью изложения. Не устаю радоваться счастью общения с Вами.
Go to the top of the page
 
+Quote Post
VVlad
сообщение Jan 14 2010, 15:43
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Если пишу не в тему, простите и не бейте больно, пожалуйста. Из файла slac080g взял за основу код msp430x20x2_adc10_08.s43
Код
#include "msp430x20x2.h"
;-------------------------------------------------------------------------------
            RSEG    CSTACK                 ; Определяем сегмент стека
;-------------------------------------------------------------------------------
            RSEG    CODE                   ; Сборка во флеш-памяти
;-------------------------------------------------------------------------------
RESET       mov.w   #SFE(CSTACK),SP        ; Инициировать указатель стека
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL ; Остановить сторожевой таймер
SetupADC10  mov.w   #CONSEQ_2+INCH_1,&ADC10CTL1; Режим разового повтора
            mov.w   #SREF_1+ADC10SHT_2+MSC+REFON+ADC10ON+ADC10IE,&ADC10CTL0;
            mov.w   #30,&TACCR0            ; Задержка для установления  Ref
            bis.w   #CCIE,&TACCTL0         ; Прерывание режима сравнения.
            mov.w   #TACLR+MC_1+TASSEL_2,&TACTL; верхний режим, SMCLK
            bis.w   #LPM0+GIE,SR           ; Вход в LPM0 с прерываниями
            bic.w   #CCIE,&TACCTL0         ; Отключить прерывание таймера
            dint                           ; Отключить прерывания
            mov.b   #020h,&ADC10DTC1       ; 32 преобразования
            bis.b   #02h,&ADC10AE0         ; опция выбора P1.1 для АЦП
SetupP1     bis.b   #001h,&P1DIR           ; выход P1.0 в режим выводы
                                           ;
Mainloop    bic.w   #ENC,&ADC10CTL0        ; Начало ОПЦ
busy_test   bit     #BUSY,&ADC10CTL1       ; ядро ADC10 неактивно?
            jnz     busy_test              ;
            mov.w   #0200h,&ADC10SA        ; Запуск буфера данных
            bis.b   #001h,&P1OUT           ; P1.0 = 1
            bis.w   #ENC+ADC10SC,&ADC10CTL0; Запуск захвата
            bis.w   #CPUOFF+GIE,SR         ; LPM0, режим запуска по ADC10_ISR
            bic.b   #001h,&P1OUT           ; P1.0 = 0
            jmp     Mainloop               ; Повтор ОПЦ
                                           ;
;-------------------------------------------------------------------------------
TA0_ISR;    ISR for TACCR0
;-------------------------------------------------------------------------------
            clr.w   &TACTL                 ; Очистка управ. регистров Timer_A
            bic.w   #LPM0,0(SP)            ; Выход из LPM0 по reti
            reti                           ;
;-------------------------------------------------------------------------------
ADC10_ISR;  Exit LPM0 on reti
;-------------------------------------------------------------------------------
            bic.w   #CPUOFF,0(SP)          ; Выход из LPM0 по reti
            reti                           ;
                                           ;
;-------------------------------------------------------------------------------
            COMMON  INTVEC                 ; Векторы прерывания
;-------------------------------------------------------------------------------
            ORG     ADC10_VECTOR           ; Вектор ADC10
            DW      ADC10_ISR
            ORG     TIMERA0_VECTOR         ; Вектор Timer_A0
            DW      TA0_ISR
            ORG     RESET_VECTOR           ; POR, ext. Reset
            DW      RESET
            END

В ответ на попытку откомпилировать получил ошибку
Код
Error[e16]: Segment RESET (size: 0x2 align: 0x1) is too long for segment definition. At least 0x2 more bytes needed. The  
problem occurred while processing the segment placement command "-Z(CONST)RESET=FFFE-FFFF", where at the  
moment of placement the available memory ranges were "-none-"
   Reserved ranges relevant to this placement:
   ffe0-ffff            INTVEC

Пытаясь найти смысл в сегменте RESET, выяснил, что переменная CSTACK отсутствует как в хедерфайле "msp430x20x2.h", так и в хедерфайле "io430x20x2.h". Допустим, в этой строке она определяется и инициализируется, сколько же тогда под неё памяти отводится. В сообщении об ошибке (е16) говорится, что сегмент слишком велик. Может быть его уменьшить? Если да, то как это сделать? Подскажите, пожалуйста, где взять описание ошибок, чтобы не беспокоить по поводу каждой ошибки. Заранее спасибо.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 14 2010, 16:39
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Сообщение модератора ON.
Выделил сообщение из ветки FAQ.
Не нужно извиняться. Следует сразу писать в свою или в отдельную ветку.
Сообщение модератора OFF.

Цитата(VVlad @ Jan 14 2010, 20:43) *
Допустим, в этой строке она определяется и инициализируется, сколько же тогда под неё памяти отводится.
Да хоть все ОЗУ под стек можете отвести. Стек растет сверху вниз (имеются ввиду адреса), а данные в ОЗУ принято располагать снизу и наращивать вверх. Если расход стека большой или данных много, то стек с данными могут где-то пересечься. Этого нужно избегать, просчитав заранее расход стека для самого неблагоприятного стечения обстоятельств (вложенные прерывания + переменные на стеке). Хотя надо отметить, что "наползание" стека на область данных это один из самых гнусных багов (сложных для диагностики и вылавливания его).
Цитата(VVlad @ Jan 14 2010, 20:43) *
В сообщении об ошибке (е16) говорится, что сегмент слишком велик. Может быть его уменьшить? Если да, то как это сделать?
Сегментацию программы измените. Определите явно ее начало в памяти. Например, так
Код
;-------------------------------------------------------------------------------
            ORG     0FC00h        ; Progam Start (1K Flash device)
;-------------------------------------------------------------------------------

вместо
Код
;-------------------------------------------------------------------------------
            RSEG    CODE            ; Сборка во флеш-памяти
;-------------------------------------------------------------------------------
Цитата(VVlad @ Jan 14 2010, 20:43) *
Подскажите, пожалуйста, где взять описание ошибок, чтобы не беспокоить по поводу каждой ошибки.
В документации/руководстве вашего компилятора. Кроме того, в IAR диагностические сообщения и без этого довольно понятны сами по себе.
Go to the top of the page
 
+Quote Post
VVlad
сообщение Jan 15 2010, 09:21
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



В ответ на

Код
#include "msp430x20x2.h"
;-------------------------------------------------------------------------------
            RSEG    CSTACK                 ; Определяем сегмент стека
;-------------------------------------------------------------------------------
            ORG     0FC00h       ; Начало программного кода (1K Flash device)
;-------------------------------------------------------------------------------
RESET       mov.w   #SFE(CSTACK),SP        ; Инициировать указатель стека
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL ; Остановить сторожевой таймер


нечто другое получено -

Код
Linking
Error[e16]: Segment CSTACK (size: 0xfcac align: 0x1) is too long for segment definition.  
At least 0xfc2c more bytes needed. The problem occurred while processing the  
segment placement command "-Z(DATA)CSTACK+_STACK_SIZE#", where at the  
moment of placement the available memory ranges were "CODE:200-27f"
   Reserved ranges relevant to this placement:
   200-27f              CSTACK
Error while running Linker


То есть ошибка та же, но вместо размера сегмента под CSTACK в 0х2 теперь 0хfc2c, требовать тоже стал больше - 0х8еса. Доступная память под стек стала 7f? (200-27f)

После прочтения http://electronix.ru/forum/index.php?showt...st&p=591968
захотел проверить, что написано в файле lnk4302012.lnx, и там то же самое -
Код
// ---------------------------------------------------------
// Read-write memory.
// ---------------------------------------------------------

-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=0200-027F
-Z(DATA)CSTACK+_STACK_SIZE#


// --------------------------------------------------------

А также ниже
Код
// ---------------------------------------------------------
// Code
// ---------------------------------------------------------

-Z(CODE)CSTART,ISR_CODE=F800-FFDF
-P(CODE)CODE=F800-FFDF

Правильно ли я понял, что когда линкер доходит до строки -Z(DATA)CSTACK+_STACK_SIZE#,
ему неоткуда взять значение STACK_SIZE#, и поэтому fcac-fc2c=80 байтов перекрываются с сегментом CODE?

В руководстве по Компилятору "MSP430 IAR C/C++ Compiler Referense Guide" на странице 31 (Placing code and Data) в главе "Segments and Memory" про стек не сказано ничего вплоть до стр.37-38. Там ясно сказано, что CSTACK - служебное зарезервированное слово для названия сегмента данных для поддержания стека. И системный код инициализирует указатель стека в конец сегмента стека. Как сказано ниже, выбрав Project>Options>General>
Options>Stack/Heap/Overrhide Defaults/Stack 50 заменил на 20, результат не вдохновил -
Код
Linking
Error[e16]: Segment CSTACK (size: 0xfc8e align: 0x1) is too long for segment definition.  
At least 0xfc0e more bytes needed. The problem occurred while processing the  
segment placement command "-Z(DATA)CSTACK+_STACK_SIZE#", where at the  
moment of placement the available memory ranges were "CODE:200-27f"
   Reserved ranges relevant to this placement:
   200-27f              CSTACK
Error while running Linker

Единственное отличие - fc8e-fc0e=снова 80.
Первый недоуменный вопрос - почему разность не изменилась с 50 до 20, а осталась 80, как и раньше?
Второй загадочный артефакт - указанная для командной строки строка -D_CSTACK_SIZE=size отсутствует в файле lnk4302012.lnx (закоментарена), как же линкер опять узнаёт размер стека как 80? Откуда?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 15 2010, 23:50
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Понимаете ли, VVlad, языки нас объединяют и разъединяют одновременно. Большинство недоразумений возникают от недопонимания или незнания языка собеседника. Языки программирования не лишены этих человеческих недостатков. Оно и понятно, т.к. они придуманы людьми же для того, чтобы люди могли "объяснить" на понятном им языке, что же они хотят от программы? В свою очередь программа-компилятор переводит человеческие "хотелки" в вид, понятный уже исполняющему инструкции ядру МК. Если вы не можете толком объяснить компилятору чего же вы хотите, то может стоит его язык получше изучить? Вот вы пишете
Цитата(VVlad @ Jan 15 2010, 14:21) *
В руководстве по Компилятору "MSP430 IAR C/C++ Compiler Referense Guide" на странице 31 (Placing code and Data) в главе "Segments and Memory" про стек не сказано ничего вплоть до стр.37-38.
но пардоньте! причем тут руководство по языку Си, если вы пишете на языке Ассемблера? laughing.gif Вы уж либо читайте руководство MSP430 IAR Assembler Reference Guide, либо пишите программу на (как я понял) более знакомом вам языке Си.
Ваш код программы из сообщения #28 будет нормально компилироваться (о нормальной работе потом поговорим wink.gif ), если в нее внести небольшие изменения, указав явно адреса, с которыми у вас возникают вопросы.
#include "msp430x20x2.h"
Код
#include "msp430x20x2.h"
;-------------------------------------------------------------------------------
            ORG     0FC00h        ; Укажем явно начало сегмента
;-------------------------------------------------------------------------------
RESET       mov.w   #0280h,SP        ; Инициировать указатель стека явным значением
Go to the top of the page
 
+Quote Post
VVlad
сообщение Jan 17 2010, 17:33
Сообщение #30


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Спасибо за дружескую поддержку, Резидент!
По Вашему совету указал адреса ЯВНО, ошибка [e16] не пропала. То же ругань на сегмент RESET,
от безысходности отметил на вкладке General Options галочку напротив Assembler Project Only. И о чудо - вместо ошибки - только предупреждение -
Код
Building configuration: interrupt0 - Debug
Updating build tree...

1  file(s) deleted.
Updating build tree...
msp430F2012_adc10.s43
Linking
Warning[w29]: Parts of segment CSTACK are initialized (as in module  
msp430F2012_adc10), even though it is of type DATA (and thus not promable)

Total number of errors: 0
Total number of warnings: 1
Поэтому удалось запустить процесс отладки и посмотреть содержимое регистров.

Верно ли, что сегмент CSTACK должен быть целиком в области данных типа DATA?
Смущает немного, что после выполнения команды
RESET mov.w #0280h,SP ; Инициировать указатель стека явным значением
в регистре SP лежит число 0x0000 (View->Register)
Режим отладки Options>Debugger>Setup>Driver>Simulator (Симулятор).

Сообщение отредактировал VVlad - Jan 17 2010, 17:45
Go to the top of the page
 
+Quote Post

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

 


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


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