Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работают прерывания SAM4LS4A IAR 6.40
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
MackNill
Никак не могу разобраться с прерываниями в IAR 6.40 ARM. Контроллер SAM4LS4A

Скачал один проект с сайта иар. Прерывания в нем работают но он на С++ мне же надо на С.
скидываю два проекта вот рабочий проект , вот нерабочий проект
Помогите пож

вот кода рабочего проекта
Код
#include <iostream>
#include "device.h"
#include <core_cm3.h>

using namespace std;

class SystemTick
{
public:
    static void Handler();
    static volatile unsigned int ticks;
};

volatile unsigned int SystemTick::ticks;

void SystemTick::Handler()
{
    SystemTick::ticks++;
}

int main()
{
    //cout << "Hello C++ world\n";
    
    // Enable SysTick interrupt using CMSIS function
    SysTick_Config(100);
    
    while (1) {}
}



вот код нерабочего

Код
//#define SAM4L
#include "atmel/iosam4l.h"
#include "core_cm4.h"
//#include "serial\serial.h"
unsigned int i;


void SysTick_Handler(void)
{
  i--;
}


void main()
{
  
  SysTick_Config(100);
  while (1)
  {
    i++;
  }  
}




andrewlekar
Исходники в архиве работать не способны в принципе. Приведённый код тоже мало о чём говорит. Скорее всего у вас не то что не работают прерывания, а код тупо не компилится. Начните с мигания светодиодом, потом прикрутите CMSIS (если он есть для этого камня). Потом уже можно будет пробовать запускать прерывания.
=F8=
Каким образом, во втором примере iar "узнает", что void SysTick_Handler(void) это обработчик прерывания?
в первом примере
#pragma location = ".intvec"
extern "C" const intvec_elem __vector_table[] =
{
......
SystemTick::Handler//Указатель на обработчик SystemTick::Handler
};
в сегменте intvec размещается структура с указателями на обработчики, где что-то подобное во втором?
MackNill
Цитата
Исходники в архиве работать не способны в принципе. Приведённый код тоже мало о чём говорит. Скорее всего у вас не то что не работают прерывания, а код тупо не компилится. Начните с мигания светодиодом, потом прикрутите CMSIS (если он есть для этого камня). Потом уже можно будет пробовать запускать прерывания.
,
Проект работает, свитодиоами мигал. У меня есть проект который я настраивал на атмел студио 6.1. Я перенес его на иар 6.4 и там все работало кроме прерываний. Нерабочий проект поидее работать и не должен. ибо он использует CMSIS, который я не включил в проект. Рабочий проект я скачал с сайта иар.

Цитата
Каким образом, во втором примере iar "узнает", что void SysTick_Handler(void) это обработчик прерывания?
в первом примере
в сегменте intvec размещается структура с указателями на обработчики, где что-то подобное во втором?

В каком то h файле описаны все названия функций прерывания. Название взято оттуда. Далее. При вызывания прерывания в режиме симулятора, программа заходит в обработчик. Поэтому считаю описание прерывания правильным. Да и если бы прерывание было не описано, то при отладке программа уходила бы в заглушку Dummy_handler(), чего как раз не происходит. Судя по всему прерывание в принципе не включено. Но где оно включается и как его включить я не знаю. И честно говоря думаю над этим уже неделю.
В IAR до этого работал с контроллерами фирмы EFM32 cortexM3, таких проблем не возникало. Сейчас Cortexm4
MackNill
посмотрел disassembler. в начале кода стоит список констант с адресами обработчиков прерываний. В SysTick_Handler стоит адрес обработчика SysTick_Handler. В чем еще может быьб дело?
andrewlekar
Может быть системный таймер попросту не включен... А как вы вообще узнали, что прерывание не происходит?
MackNill
Я его настраиваю. Это делается одной командой.
Да и я сначало писал проект на atmel studio 6.1 там все работало. При переносе не стали работать прерывания
andrewlekar
Кидайте уже проект целиком - посмотрим.

И уточните, как именно вы узнали, что прерывание не происходит.
MackNill
Цитата(andrewlekar @ Aug 6 2013, 10:51) *
Кидайте уже проект целиком - посмотрим.

использую IAR ARM 6.4
Вот ссылка на рабочий проект на языке С++.
Вот ссылка на нерабочий проект на языке С.
Проекты написаны с использованием внутренних библиотек ИАР.

Цитата(andrewlekar @ Aug 6 2013, 10:51) *
И уточните, как именно вы узнали, что прерывание не происходит.

Я поставил внутри обработчика прерываний брейкпоинт. Программа в прерывании не останавливается. Далее при закомментированном прерывании поидее программа должна уходить к Dummy_handler(), так как при вызове прерывании и при отсутствии обработчика программа по идее должна уходит в заглушку(Dummy_handler).
Потом в режиме Emulator я программно имитировал прерывание(функция ИАР), и программа благополучно зашла в прерывание и остановилась на поставленном там брейкпоинте.
andrewlekar
Я попросил скинуть проект целиком. В архиве по ссылке нет ни CMSIS, ни векторов прерываний, ничего.
MackNill
Цитата(andrewlekar @ Aug 6 2013, 16:22) *
Я попросил скинуть проект целиком. В архиве по ссылке нет ни CMSIS, ни векторов прерываний, ничего.

я написал что cmsis там не используется. Я перевел все на функции IAR. Проект должен рабюотать при наличии ИАР
andrewlekar
В том проекте, что вы скинули, используется несуществующий файл interrupt.s, нет галки для иара, чтобы он использовал CMSIS библиотеки. Добавьте к переменной i атрибут volatile. Инициализируйте UART и добавьте отладочную печать при старте программы и при входе в прерывание (возможно не работает отладчик). Если не заработает, то переделанный проект можете снова выложить для проверки.
MackNill
извиняюсь. Там в проекте нужно удалить прикрепеленный файл с разрешение *.i и interrupt.s .
Вектора прерываний описаны в sturtup_M.c, а SysTick_Config описана в core_cm4.h.
Вот ссылка на картинку где галка на использование CMSIS стоит ссылка
andrewlekar
Я в курсе, я его уже собрал. Ещё раз прочитайте рекомендации. Камня для проверки у меня нет, а в симуляторе всё работает.
MackNill
Цитата(andrewlekar @ Aug 6 2013, 16:48) *
Я в курсе, я его уже собрал. Ещё раз прочитайте рекомендации. Камня для проверки у меня нет, а в симуляторе всё работает.

дак вот дело в том что у меня и в симуляторе не работает. Или как у вас в симуляторе работает?
Проект на С++ у меня работает, а мой на С нет.
И на камне так же не работает. Проверял другим проектомю Там было прерывание и по атймеру и по уарту, но ничего не работало.
andrewlekar
У вас в IAR есть примеры? Поищите в папке IAR/arm/examples/atmel/sam4s/sam4s-ek/examples/getting-started. Оттуда и пляшите.
MackNill
Цитата(andrewlekar @ Aug 6 2013, 18:12) *
У вас в IAR есть примеры? Поищите в папке IAR/arm/examples/atmel/sam4s/sam4s-ek/examples/getting-started. Оттуда и пляшите.

Я так понял что мой код в режиме симуляции у Вас работает. То есть заходит в прерывание. Что вы сделали с проектом, что он заработал?
Не понимаю почему же у меня не работает.
Примеры я смотрел и сделано у меня все по аналогии.
andrewlekar
Он у меня заходит, но разово. Я обычно с симуляторами и отладчиками дела не имею - отлаживаюсь отладочной печатью. И вам советую - возможно прерывание не срабатывает потому что в симуляторе не тикает время или ещё что.
MackNill
В общем у меня заработало на половину. Я взял рабочий пример на С++. Скопировал туда свой си файл из нерабочего проекта и заменил startup_M_cpp.cpp на startup_M.c. Так же поменял в настройках язык с С++ на С.
В симуляторе заработали прерывания. А вот на устройстве снова отказались. Не понимаю что за фигня творится у меня на компьютере. С чем может быть связано?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.