В ответ на
Код
#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? Откуда?