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

 
 
 
Reply to this topicStart new topic
> Как задать размер CSTACK?, IAR for ARM
Dmitro25
сообщение Aug 15 2013, 12:33
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 4-04-07
Пользователь №: 26 770



Здравствуйте.
Начал осваивать ARM, использую для компиляции и отладки IAR.
Столкнулся с проблемой некорректно работающей функции printf, причина проблемы оказалась в недостаточном размере стека (CSTACK). Что меня неприятно поразило - так это то, что в настройках линкера размер стека задан достаточно большим для моего проекта (0x400). Однако, когда я стал запускать проект в эмуляторе, оказалось, что указатель стека (R13) принимает при старте программы не указанное мной значение, а значительно меньшее.
Увеличить начальное значение указателя стека удалось изменением следующей строчки в strtup-файле:
Код
static unsigned long pulStack[64] @ ".noinit";

Размер массива был увеличен с 64 до 256.
Далее pulStack фигурирует в таблице векторов прерываний:
Код
__root const uVectorEntry __vector_table[] @ ".intvec" =
{
    { .ulPtr = (unsigned long)pulStack + sizeof(pulStack) },
...

Я так понял, что в качестве первого вектора в таблице прерываний указывается начальный размер стека. Но тогда почему при инициализации вектора не используются константы, связанные с задаваемым размером CSTACK?
В результате получается, что заданный для линкера размер CSTACK нигде в программе не фигурирует?
Возможно, я взял "неправильный" startup-файл или упускаю какую-то другую важную деталь?

PS: контроллер ARM Stellaris Cortex M3 LM3S9971; компилятор IAR for ARM v6.50

Сообщение отредактировал Dmitro25 - Aug 16 2013, 04:54
Go to the top of the page
 
+Quote Post
Dmitro25
сообщение Aug 16 2013, 11:20
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 4-04-07
Пользователь №: 26 770



Всё, разобрался.
Дело оказалось в startup-файле (я его взял из демо-примеров отладочной платы на LM3S6965). Поменял его на на файл "arm\src\lib\thumb\cstartup_M.c", находящийся внутри IARa, добавил дополнительные вектора, обработчик по умолчанию и всё заработало. Единственное важное дополнение: перед определением таблицей векторов необходимо вставить "__root" (в файле от IAR его нет), иначе таблица векторов заменяется линковщиком на взятую из автоматически подключаемой для используемого процессора библиотеки rt7M_tl.a.
Go to the top of the page
 
+Quote Post
karavaevas
сообщение Dec 24 2014, 02:50
Сообщение #3





Группа: Новичок
Сообщений: 9
Регистрация: 18-12-14
Из: Саратов
Пользователь №: 84 179



Цитата(Dmitro25 @ Aug 16 2013, 14:20) *
Всё, разобрался.
Дело оказалось в startup-файле (я его взял из демо-примеров отладочной платы на LM3S6965). Поменял его на на файл "arm\src\lib\thumb\cstartup_M.c", находящийся внутри IARa, добавил дополнительные вектора, обработчик по умолчанию и всё заработало. Единственное важное дополнение: перед определением таблицей векторов необходимо вставить "__root" (в файле от IAR его нет), иначе таблица векторов заменяется линковщиком на взятую из автоматически подключаемой для используемого процессора библиотеки rt7M_tl.a.

Dmitro25, приветствую!
Не сочтете ли за труд прислать полученный пример cstartup_M.c файла для этого или еще какого-нибудь проекта (лучше небольшой проект целиком)? Я осваиваю ARM после AVR и пришел в полный затык, не понимая, как здесь организовать прерывание.
У меня AT91SAM3X8E и IAR EWARM 7.3. Я вычитал в яровском "C/C++ development guide", что cstartup_M.c надо копировать в папку с проектом и модифицировать, прописав в нем свои обработчики. А вот как их там прописать мне непонятно и нормальные примеры и/или описания этого процесса найти не могу.

Мой рабочий код:
CODE
#define __SAM3X8E__
#include <iosam3xa.h>

#define BITON(X, N) (X)|=(1<<(N))
#define BITOFF(X, N) (X)&=~(1<<(N))
#define GETBIT(X, N) ((X&(1<<(N)))&&1)

void main(){
WDT->WDT_MR=0x00008FFF; //Выключить сторожевой таймер

// Переключаемся на внешний кварц (12МГц)
PMC->CKGR_MOR=0x0137FF01; // Включить внешний кварц 3-20 MHz (у нас 12 MHz) и выключить внутренний RC-генератор
while (!(0x00000001&PMC->PMC_SR)); // Дождаться стабилизации кварца

// Настройка ФАПЧ
PMC->CKGR_PLLAR = 0x200A3F03; // MUL=10, DIV=3 PLLACLK= 12 MHz*(MUL+1)/DIV = 44 MHz (но потом делится пополам в PMC_MCKR - PLLADIV2=1)
while (!(0x00000002&PMC->PMC_SR)); // Дождаться захвата ФАПЧ

// Выбираем вход Master Clock - PLLA без деления. Установка в 2 этапа - сначала смена делителей, потом смена источника такта
PMC->PMC_MCKR=0x00001001; // Выход Master Clock = Main Clock c делителем PLL на 2 (бит PLLADIV2=1)
while (!(0x00000008&PMC->PMC_SR)); // Дождаться установки Master Clock
PMC->PMC_MCKR=0x00001002; // Выход Master Clock = PLLA c делителем PLL на 2 (бит PLLADIV2=1)
while (!(0x00000008&PMC->PMC_SR)); // Дождаться установки Master Clock

PMC->PMC_PCER0=1<<13; // Тактировать PIOC
PMC->PMC_PCER0=1<<27; // Тактировать TC0

PIOC->PIO_OER=1<<12; // PC12 as output pin
PIOC->PIO_ODR=1<<13; // PC13 as input pin
PIOC->PIO_PER=3<<12; // PC12, PC13 as PIO pins

TC0->TC_CHANNEL->TC_RC=1000; // Загружаем регистр сравнения RC (11MHz/1000 =11000 раз в сек событие сравнения RC)
TC0->TC_CHANNEL->TC_CMR=0x0000C4000; // Timer_Clock1 selected (MCK/2=11MHz), Waveform Enabled, Up mode with autotrigger (autoreset) on RC

while (GETBIT(PIOC->PIO_PDSR, 13)); // Ждем, пока не замкнута на GND тактовая кнопка на PC13
TC0->TC_CHANNEL->TC_CCR=0x00000005; //CLKEN=1, SWTRG=1 - RESET+Start
while(1){
if (TC0->TC_CHANNEL->TC_SR&0x00000010){ // Если было сравнение с RC (флаг автоматически сбрасывается после чтения регистра)
if (GETBIT(PIOC->PIO_ODSR, 12)) // переключаем состояние ноги PC12
PIOC->PIO_CODR=1<<12;
else
PIOC->PIO_SODR=1<<12;
}
}
}


Мне нужно заменить последовательный опрос таймера прерыванием, чтобы понять принцип организации этого на ARM.
Для удобства можно на e-mail: karavaevasСОБАКАgmail.com

Сообщение отредактировал IgorKossak - Dec 24 2014, 08:37
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:27
Рейтинг@Mail.ru


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