Мда, похоже никто не хочет присоединиться. Отдуваюсь 1) Project->Options->General options->Target.
Выбери не Core а Device и в меню выбери свой проц.
2) Project->Options->C/C++ Compiler->List
Поставь галочки Output list file и assembler mnemonics
3) Project->Options->Assembler->List
Поставь галочку Output list file, остальные можно оставить по умолчанию
4) Project->Options->Linker->Output
Сними галочку с Override default, пусть он сам генерит файл какой ему нужен для C-Spy. Если будешь пользоваться внутрисхемной отладкой и прошивкой через JTAG (Wiggler, J-Link/MT-Link), то поставь галочку Allow C-Spy specific extra output file и на вкладке Extra output галочку Generate extra output file, а в списке выбери формат simple-code. Если нужно будет получать Intel-HEX для заливки через bootloader, то выберешь его здесь или на вкладке extra options напишешь -Ointel-extended,(CODE)=.hex
5) Project->Options->Linker->List
Поставь галочку Generate linker listing и segment map. В конце файла .map в директории Debug\List сможешь посмотреть в какие адреса что попало.
6) В порядке "шлифовки" - укажи путь к .xcl как $PROJ_DIR$\имя_файла. Тогда при переносе проекта в другую папку не придется править путь в этом месте. И лучше держать его (.xcl) в корне проекта а не в папке settings (она является служебной папкой ИАРа и черт его знает что он с ней делает).
7) Не знаю, где ты взял этот .xcl, но в нем не определен сегмент DATA_C зато определены HUGE_x, которые ARMу по идее не нужны. Замени HUGE_ на DATA_.
8) #include "iolpc2119.h" лучше писать как #include <iolpc2119.h>, тогда файл будет подключаться из \IAR\ARM\INC и не нужно будет его таскать с пректом.
9) Не нужно делать IO0SET|=(1UL<<SCLK), достаточно IO0SET = (1UL<<SCLK); оно делает "или" само внутри процессора.
10) и выкини lpc210x_evb_cstartup.s79 из проекта.
После выполнения этих операций у меня все скомпилилось и судя по .map расположилось в правильные адреса.
Обрати внимание на warnings при компиляции - их быть не должно, возможно большинство проблем из-за них.
Еще глянул другие части программы:
if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
Если сделаешь размер буфера равным степени двойки, то будет оптимальнее:
tx_rd_index0 = ++tx_rd_index0 & (TX_BUFFER_SIZE0 - 1);
tx_counter0 и rx_counter0 должны быть volatile.
И еще непонятно зачем ты все файлы включил в один, почему не используешь отдельные модули?
-
- Ответ: Спасибо за советы, опробую всё - отпишусь. - PAL(26.09.2006 12:07)