Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Хочу попробовать ARM, подскажите, что для этого нужно?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Страницы: 1, 2, 3, 4, 5, 6
Andrew_Ch
2 sonycman

Тогда моем его, а средство вот ug_krgaБОБАКАmail.ru. Сыпасыбо! ;-)
Alex_inventor
2 Andy Great:
Не могли бы вы выложить keil компилятор (AA.exe LA.exe CA.exe). Или может ресурс знаете, где скачать можно. И какой версии этот компилятор. На сайте Keil.com лазил и что-то не нашёл линки для скачиваний huh.gif . Может они его уже не поддерживают? sad.gif
Alex_inventor
Проверил для какого компилятора написаны примеры проектов, оказалось для GNU! Я в растерянности wacko.gif В среде есть только RealViwe компилятор. В книге пишут и приводят примеры для Keil компилятора. А проекты сделаны для GNU. Попытка откомпилировать GNU исходники под RealViwe приводит к ошибке:
Build target 'Target 1'
compiling fibo.c...
fibo.c: Warning: C3910W: Old syntax, please use '--via'.
fibo.c: Warning: C3910W: Old syntax, please use '--apcs'.
fibo.c: Error: C3494E: No --device option specified. This option is mandatory.
Target not created
Чтож sad.gif будем проавить исходники. А я надеялся отделатся малой кровью. Вот ТАК!
Alex_inventor
Подскажите, что это за ошибка:
Build target 'Target 1'
compiling fibo.c...
fibo.c: Warning: C3910W: Old syntax, please use '--via'.
fibo.c: error: C3900U: Unrecognized option '-pu'.
fibo.c: Warning: C3910W: Old syntax, please use '--apcs'.
fibo.c: Error: C3494E: No --device option specified. This option is mandatory.
Target not created

Не могу понять. Компилятор RealView.
sonycman
Я вот тоже не в понятках пока - разбираюсь со Startup Code для SAM7, почти со всем разобрался, но непонятно вот это:

IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap

Эти строчки стоят в тексте уже после вызова __main, но обрабатываются, по-моему, до него.
Что это такое? "Heap" - куча какая-то? smile.gif
Посмотрел в доках - __user_initial_stackheap возвращает данные о размере стёка и этой самой кучи. На кой чёрт это надо? Стёк и куча уже были заданы гораздо раньше этого.
Может, просвятит кто тёмного?

2Alex_inventor
А почему бы тебе не установить GCC и не мучиться на первых порах? Весит около 20 метров. Ссылка даётся на keil.com вместе с самим uVision.
Alex_inventor
Народ, а как в uVision узнать размер полцчившегося кода. Во всех нормальных компилятарах размер сразу же вывоился после компиляции. А сдесь нету sad.gif Открывать окно с flash не предлогать. Должен быть способ проще.
Alex_inventor
Hello All.
Изучаю UART в LPC20xx. Есть одна непонятность. Суть: Чтобы настроить UART на заданную частоту надо занести в регистры DLM и DLL значение делителя. На UART поступает частота с шины VPB. В DATASHETE сказано, что эта частота идёт напрямую. Но на самом деле она делится на 16. (обнаружено экспериментальным путём ) . Может кто-нибудь объяснить такое поведение.
P.s. F=14.7456MHz, PLLMUL=1, PLLDIV=1, VPBDIV=1. Для частоты 9600, по идеи надо занести значение F/9600= 0x0600, а на самом деле такую частоту можно получить только при значение 0x0060. Может ещё с какой периферией такие приколы есть?
Alex_inventor
Кто-нибудь пользуется такой софтиной “Embest IDE for ARM” (http://www.armkits.com/Product/idemain.asp). Есть ли лекарство от жадности?
А вот бесплатная софтина для инициализации регистров для АРМ: http://www.armkits.com/Product/regeditor.asp.


Вот прямой линк на среду uVision3 (https://www.keil.com/arm/demo/eval/arm.htm).
2sonycman
Заметил что среда редакции 17.01.07 и весит 65метров. А моя весит 60метров. Хотя обе версии 3.04
Может там Keil компилятор появился?
sonycman
2Alex_inventor
Там uVision версии 3.50, это просто архив называется 3.04...
А Кейла там нет sad.gif
Andy Great
Цитата(Alex_inventor @ Jan 25 2007, 16:44) *
2 Andy Great:
Не могли бы вы выложить keil компилятор (AA.exe LA.exe CA.exe). Или может ресурс знаете, где скачать можно. И какой версии этот компилятор. На сайте Keil.com лазил и что-то не нашёл линки для скачиваний huh.gif . Может они его уже не поддерживают? sad.gif

Там наверное, не только компилера, а и библиотек нету. А Примеры к RV ищите в другой ветке. КЕсли надо именно GCC, используйте GNUARM - работает, только надо ключи правильно указать. Возможно, Кейловский компилер есть в версии 3,03а, если нет, то в версии 2,50. Поищу.
IgorKossak
Цитата(Alex_inventor @ Jan 26 2007, 02:33) *
Кто-нибудь пользуется такой софтиной “Embest IDE for ARM” (http://www.armkits.com/Product/idemain.asp). Есть ли лекарство от жадности?

Покупал стартер-кит этой фирмы.
К нему шла среда, но ограниченная. Попользовался около часа, не впечатлило.
Даже IAR намного круче. Не говоря уже об RV.
Кстати Eclipse вместе с тулчейном от GNU смотрится весьма достойно.
Dr.Craft
В 3,03 уже нету CARMa, был в 3,02. Выкладываю те файлы что VAI давал на сахаре http://caxapa.ru/71537.html У меня правда под крякнутым uVision 3.03a он требовал лицензию, разбираться не стал, пользуюсь IAR'ом.
Alex_inventor
Скачал Embest Register Editor. Прога так себе… glare.gif Напоминает записную книжку – справочник. Можно неплохо использовать, как быстрый способ посмотреть, какие регистры есть в контроллере и их назначение и особенности. Можно давольно просто вносить новые камни (что радует smile.gif ). Можно настраивать регистры какого-нибудь проца, а потом произвести экспорт в txt файл. Правда, имхо, тупой экспорт и врядли этим можно пользоваться. В общем смотрите сами. blink.gif
Некоторых может повергнуть в шок надпись при запуске проги “данная таблица сортировки не поддерживается операционной системой” после 17,5метров закачки ohmy.gif . И что прога не работает. Лечится легко. Зайдите панель управления->языки и настройки->поставить галочку на поддержку корейского, японского, китайского языка. Система запросит кампакт с виндой и 200 метров свободного пространства на диске. После установки будет всё OK. P.S smile.gif . в самой проги ни одного иероглифа не обнаружил, но прога корейская, может поэтому cranky.gif ?
Alex_inventor
To All help.gif
Объясните в чём причина. Вот пример кода (uVision3,ARMCC):

//********************ПРИСОЕДЕНЯЕМЫЕ ФАЙЛЫ********************
#include <LPC210x.H> // LPC21xx definitions
#include "binary.h"
#include <stdio.h>


//**********************ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ************************
unsigned char string[] = {"hello world \n"};




/********************************************************************
*************************ПОДПРОГРАММЫ********************************
********************************************************************/
void initialisation(void)
{

//Настраиваим UART0********************************************
PINSEL0 |= bin(00000101); //задействовать выводы RX0 и RX1
U0LCR = bin(10000000); //Бит DLAB-1 разрешение настройки делителей
U0DLL = 0x60; //Program the divisor latch for 9600 baud
U0DLM = 0x00;
U0FCR = bin(01001111); //enable the FIFO's
U0LCR = bin(00110011); //Program the line control 8\N\1

}


void putsf(unsigned char *str)
{
int x;
for(x=0;x<100;x++)
{
if( str[x]==0) break;
putchar(str[x]);
}
}


/***********************************************************************
************************Основная программа******************************
***********************************************************************/
int main(void)
{
initialisation();
while(1)
{
delay_us(1000000);
putsf(string);

}
}

Так вот, если не присоединять <stdio.h>, ну и соответственно не пользоватся putchar, а тупо вводить данные в THR то всё отправляется нормально. Если присоеденить данную библиотеку, то при включении <d>(симуляции) , (гдето в стартовом асемблерном коде, не доходит до main даже) срабатывает SWI прерывание, и проц застревает в заглушке. Почему так?
2sonycman
Запарил редактор дизасемблера angry.gif . Конкретно скролл справа wacko.gif . Его положение неадекватно реагирует на реальное местоположение курсора в программе (всё время внизу находится) Из-за этого сильно затрудняется навигация, и у меня начинается чувстао "прострации" wacko.gif (не знаю где нахожусь). Происходит когда попадаю в асемблерную часть, созданую keilom как куски оптимизации (ну вообщем вы меня поняли). Ни одного коментария wacko.gif huh.gif ! Бескрайний массив ассемблерных команд blink.gif . (Почему не сделать как в CodeVision где всё имеет коментарии smile.gif и вполне читабельно?)
Так вот, меня интересует этот баг со скролом в версии 3.05 исправлен? А то думаю скачать ли?
sonycman
Цитата(Alex_inventor @ Jan 26 2007, 16:01) *
Запарил редактор дизасемблера angry.gif . Конкретно скролл справа wacko.gif . Его положение неадекватно реагирует на реальное местоположение курсора в программе (всё время внизу находится) Из-за этого сильно затрудняется навигация, и у меня начинается чувстао "прострации" wacko.gif (не знаю где нахожусь). Происходит когда попадаю в асемблерную часть, созданую keilom как куски оптимизации (ну вообщем вы меня поняли). Ни одного коментария wacko.gif huh.gif ! Бескрайний массив ассемблерных команд blink.gif . (Почему не сделать как в CodeVision где всё имеет коментарии smile.gif и вполне читабельно?)
Так вот, меня интересует этот баг со скролом в версии 3.05 исправлен? А то думаю скачать ли?


Да вроде нормально всё с окном дизассемблера smile.gif
Кусорчик прыгает, конечно, и может находиться как внизу, посередине, так и вверху страницы.

А вставленные функции сишной библиотеки (по крайней мере __main и другие при инициализации) действительно идут без исходников, только ассемблерный код. sad.gif

Блин, тяжело изучать ARM по книге, в которой все примеры даны для компилятора CARM.
Почему он больше не поддерживается?
Этот RV попроще кажется. Нет ни __ram, ни некоторых других полезных преффиксов sad.gif
Alex_inventor
Запарил уже uVision. angry.gif Надоело уже переустанавливать среду. Вдруг нестого не с сяго начал выдовать:
compiling main.c...
--- Error: can't execute 'gcc'
main.c - 1 Error(s), 0 Warning(s).
Пути к компилеру проверял, всё указано верно? В чём проблема?
Alex_inventor
Цитата
Блин, тяжело изучать ARM по книге, в которой все примеры даны для компилятора CARM.
Почему он больше не поддерживается?
Этот RV попроще кажется. Нет ни __ram, ни некоторых других полезных преффиксов

О чём и речь! Почему я и искал этот компиллер. А вобще я непойму почему от него отказались? Во всех тестах, какие я встречал, он был лучший.
Утачню вопрос по поводу скрола. Если находишся в отладке(симулятор), и ходишь по шагам, то скрол беспричинно не телепортируется в самый низ? Это сильно нагружает образное мышление. Находишся в начале адресов flasha, а посмотришь на скрол вроде как в конце? Несастыковачка какая то? Мне это важно знать, а то нехочется качать 65метров с точно такимже багом!
sonycman
Цитата(Alex_inventor @ Jan 26 2007, 16:44) *
Утачню вопрос по поводу скрола. Если находишся в отладке(симулятор), и ходишь по шагам, то скрол беспричинно не телепортируется в самый низ? Это сильно нагружает образное мышление. Находишся в начале адресов flasha, а посмотришь на скрол вроде как в конце? Несастыковачка какая то? Мне это важно знать, а то нехочется качать 65метров с точно такимже багом!


Имеешь ввиду, у тебя экран дебаггера прыгает вниз и уходит от жёлтой стрелки указателя текущей команды?
Нет, такого точно не было.
Alex_inventor
Нет экран не прыгает ниже или выше указателя. С этим всё впорядке. Просто гдебы не находиля указатель скрол всегда внизу. Пример: Прыгнули мы командой B куданибудь. Так посмотрел справа на бегунок и имеем представление в какой обоасти мы находимся. Бегунок частично работает если его курсором тягать. Показывается слева адрес и после отпускания кнопки мыши попадаем туда куда надо (правда листинг не прокручивается динамически с бегунком х...о). Но если сделать шаг то бегунок опять вниз слетает. Есть такой баг? Уточняю именно в окне дизасемблера.
sonycman
Цитата(Alex_inventor @ Jan 26 2007, 17:20) *
Нет экран не прыгает ниже или выше указателя. С этим всё впорядке. Просто гдебы не находиля указатель скрол всегда внизу. Пример: Прыгнули мы командой B куданибудь. Так посмотрел справа на бегунок и имеем представление в какой обоасти мы находимся. Бегунок частично работает если его курсором тягать. Показывается слева адрес и после отпускания кнопки мыши попадаем туда куда надо (правда листинг не прокручивается динамически с бегунком х...о). Но если сделать шаг то бегунок опять вниз слетает. Есть такой баг? Уточняю именно в окне дизасемблера.


Да, такая шняга есть sad.gif
Но меня это не смущает, адрес-то всегда перед глазами smile.gif

Слушай, я, может, IAR для сравнения попробовать? Говорят - "самая охренительно задокументированная среда" blink.gif
Правда код генерит погано...
Не знаешь её размер и кряки где лежат?
Dr.Craft
Примерно 100 мБ IAR весит с небольшим.
sonycman
Вот цитата с форума IXBT.com:
Цитата
Но поковырявшись понемногу с CrossWorks, IAR и KEIL, хочу сказать следующее.
Начинать надо, безусловно, с CrossWorks. Скачать, запустить, проверить что свежеспаяный Wiggler работоспособен и снести этот CrossWorks к такой-то матери.
Если страшно разбираться с новым процом и охота привычной среды, то можно поставить IAR. Wiggler с ним тоже вяжется и вполне прилично работает.
Но, блин, этот KEIL... Он мне все карты спутал. После него мне на IAR даже смотреть не хочется, просто убожество. Определённо - KEIL действительно крут, имхо. Но пока у меня всё по старику Крылову, про "лису и виноград". Никак не могу wiggler с ним заставить работать ( приходится через H-JTAG, не знаю, может есть другой способ, но без всех этих извратов *никсовых ).

В общем, имхо если охота покататься на Феррари, хотя нет, скорее на Ягуаре ( в том смысле, в плане комфорта и дизайна Феррари тут и близко не валялась ), то это KEIL.


Что-то мне уже расхотелось IAR ставить smile.gif
Тем более весит больше Кейла...
Alex_inventor
Про IAR могу поведать следующую историю. Раньше, когда осваивал AVR, постоянно сталкивался на форумах с восхваления этого IAR (сам работал в CodeVision). Так вот, начал я искать возможности использовать его. После долгих поисков, нарыл в инете чудо-multi кряк. Кряк сделан на славу (а музыка в нём такая, что я по пол часа слушал много раз) сразу видно профессионалы. Кряк генерит ключи для MSK-51 v7.20, AVR v4.12a, AVR32 v2.10A, ARM v4.31A, R16C & R8C v3.10A, NEC78A v4.30A, MSP430 v.3.40A, SAM8 v2.21A, MAXQ v1.13C. По причине природной жадности ко всему холявному, я скачал все эти среды (хотя скорее всего большинством, если не всеми не воспользуюсь никогда). Скачать можно только на iar.com после заполнения формы. ARM среда весит 94,2 метра. Среды trial, но после скормления ключа превращаются в full. В общем посмотрел я на этот IAR… и разочаровался sad.gif . В общих чертах следующие замечания: крайне трудно стартовать (help на основе PDF, в trial версии help урезан до невозможности, практически никакого серьёзного ответа не найти, только основы, но основы большие), нет привычных вещей типа bin, стартового кодировщика, криво сделаны закладки, симулятор убогий, да и много чего ещё не так, не помню уже. На одном форуме человек писал про IAR следующее (не дословно): “Исходник это основное. Среда только надстройка предназначенная для удобства работы с исходником. В IAR же, такое ощущение что исходник, нечто второстепенное ”. В общем смысле я с ним согласен. (Не ругайте меня IAR поклонники, так как оценка зависит от привязанности. Если когда-то научился работать, то уже лучшая среда. Моё первое впечатление от него такое.)
Про IAR компилятор для AVR читал что лучший. Но для ARM IAR компилятор, судя по форумам, хуже, чем обсуждаемые выше. Плюс IAR по сравнению с uVision мульти-платформенность (оболочка везде одинаковая). Но смотрел список поддерживаемых ARM в IAR и Keil, так в Keil в три раза больше. Возможности среды uVision на голову превосходят IAR. Это и отладочные функции. Круто придумали. Я например написал функцию(не сам, брал исходники) подсчёта количества тактов и прошедшего времени в us, очень удобно. Очень понравилось показ времени на каждой инструкции при отладке. Балдею от настроек цветов, горячих клавиш, собственной библиотеки, структуры папок проекта, да практически всего. Просто сказка какая-то w00t.gif . Сразу видно, что писателей среды потом заставляют на ней работать smile3046.gif . А не как у некоторых, становится такое ощущение что, писатели люто ненавидят пользователей их творений, и всячески пытаются исортить им жизнь angry.gif (сплошь и поперёк сталкивался, когда искал среду для проектирования ПП и схем). Но uVision не идеал. Есть недочёты. Но идеала не бывает, наверное?
To All, ответит кто нибудь на вопросы заданные выше? Всем a14.gif
sonycman
2Alex_inventor
Понятно, спасибо за разъяснение smile.gif
Слушай, а кряк к IAR может пришлёшь на мыло, музыку послушать ? smile.gif
Да и может пригодится когда.

А на какой софтине для ПП остановился?
Alex_inventor
2sonycman
Кидай мыло, а то я письмо удалил.
Что касается среды то, наверное, я перебрал их все. На эту тему могу книгу написать. Из Интернета качал всё, хоть чуточку напоминающую CAD. Покупал DVD. Пробовал и удалял. Ко всем были те или иные претензии. Краткий перечень: PCAD(2000,02,06), OrCad (9.2 10.5), Electronic Workbench, Zuken CADSTAR, CAM350 8.7, Accel EDA 15, MicroCAP, Eagle 4.16r2, DipTrace1.3 и др. некоторые не помню, а некоторые “выкидыши” и не запоминал. Основной критерий при выборе максимальное удобство, простота использования (не за счёт качества), интуитивно понятный интерфейс.
До этого работал в любительской проге SprintLayout4 (сейчас 5 версия есть). Порога, с точки зрения удобства, устраивала на сто процентов. smile.gif Трассировал вручную. Трасировщик что там есть, скорее как демонстрация, а не для работы. Но шло время и захотелось большего. Конкретно: рисуешь схему, а по схеме на тебе плату + нормальная авторазводка. Хотя по авто трассировке, сплошь и поперёк слышишь о её кривости, однако начальную работу можно доверить ей, ну а потом “долизать” схему вручную. Так, имхо, делают почти все. Так вот, начал я поиски среды. И ко всем применял стереотипы удобства работы SLayout. И ни одна среда полностью не подошла. Ну не могу я удобство променять sad.gif . Привык уже. Как оказалось, серьёзные среды разрабатывают несколько компаний. Пересчитать можно на пальцах одной руки. Отдельно хочу выделить одну компанию: Altium. Эта австралийская корпорация, поскупала другие компании, и на данный момент её продуктами являются такие проекты как PCAD, OrCAD, Altium Desiner 6. Вот на последнем мой взор и остановился. Читал её возможности – впечатляют w00t.gif . Вот это точно среда сквозного проектирования! Начиная со схемы, и закачивания 3D видом платы, плисы и многое другое. Скриншёты очень даже ничего. Но есть одна большая проблема у этой среды sad.gif . Весит ~1,6Гб. Я её неделю качать буду. Крэки в инете водятся. По поводу PCAD, они его почти не поддерживают. Разницу между 2000-2006 в лупу искать надо. С OrCad та-же история. Походу все силы на AltiumDesiner бросили. Да и вообще не понимаю почему PCad так популярен. Работа с ним (в особенности по созданию элементов) эквилибристика какая-то!
Есть совтина SPlan. Разводит схемы. Удобная. SPlan и SprintLayout писал один автор. Но они не скооперированы sad.gif . Не знаю, почему автор не соединит их? Если это произойдет, да ещё и трасировщик нормальный прилепит, да хотя бы Spectru, то по-моему, все отдыхать будут.
sonycman
2Alex_inventor
Моё мыло: sonycman(собачка)mail(тчк)ru

Да-а, ты прямо писатель smile.gif
Наверное, час пост писал?

А вообще интересно почитать, конечно. Надо-же, ты столько софта перелопатил. Я пробовал только PCAD начиная с 2000 до 2006 (как ты) и OrCAD10.
Остановился на Пикаде. Хотя и Оркад тоже хорош.
Но Пикад показался удобнее.
Не знаю, почему тебе он кажется неудобным. Создать новый элемент - минутное дело. Что паттерн, что символ. Оркад в этом смысле похуже.
Насчёт Sprint Layout - не думал, что его хоть как-то можно поставить рядом с огромными кадами smile.gif

Это всё имхо smile.gif

Тут, наверное, дело привычки. Я начинал именно с Пикада, а ты - со Спринта. Старый друг лучше новых двух smile.gif

Такой вот оффтопчик небольшой smile.gif


Всё, дочитал я книгу по LPC2000. Неплохая, если не считать, что большинство примеров не будет работать под Кейлом (если только GCC ставить?).
Последняя глава по Микровижн как раз идёт smile.gif
Завтра начну изучать мануал по SAM7, плата с которым скоро должна приехать smile.gif
А пока сложилось впечатление, что LPC2000 и AT91SAM7 достойны один другого. Вот если бы взять всё лучшее из каждого и соединить - был бы идеальный ARM микроконтроллер начального уровня...smile.gif
Alex_inventor
Цитата
Всё, дочитал я книгу по LPC2000. Неплохая, если не считать, что большинство примеров не будет работать под Кейлом (если только GCC ставить?).

Необольщайся. Я скачал этот GCC. Ни один пример не работает. Везде примерно такая ошибка sad.gif :
Build target 'Flash'
compiling main.c...
arm-uclibc-gcc: cannot specify -o with -c or -S and multiple compilations
assembling Startup.s...
Assembler messages:
Error: Error: can't open Files\Keil\ARM\INC\Philips\ for reading
Files\Keil\ARM\INC\Philips\: No error
Target not created angry.gif
И самое не приятное что непонятно из-за чего. cranky.gif Но есть в этом и один, но большой плюс. Приходится построчно копировать исходники, компилировать, искать ошибки, искать ответы на непонятки, и как следствие неплохое самообучение. Правда силу воли надо иметь. Нудно иногда бывает.
Насчёт среды, если ты работаешь в PCAD и он тебя не напрягает, значит, эта среда для тебя. Значит, она предоставляет тебе все ресурсы, в которых у тебя возникает потребность. Не больше, не меньше. И это правильно. У меня был случай, когда я зашёл к другу (геймеру), я заметил, что у него winamp был с футуристическим скином. Причём в крайне выраженной форме wacko.gif . Пикассо отдыхает! Я с трудом нашёл кнопку для настройки скина, на ощупь cool.gif , и поставил стандартный. Каково же было моё удивление, когда мой друг с криками “не трогай птичку!!! ” набросился на меня maniac.gif . Дааа… дело привычки!
Спор какая среда лучше, напоминает софистику. На изначально ошибочных условиях делаются все остальные выводы. Я на это смотрю иначе. Если есть среда A,B,C. Средой A пользуюсь я. Средой B ты. А среда С устраивает нас обоих, то эта среда лучшая из этих трёх. Т.е. среда С предоставляет все нам необходимые сервисы. Напоследок хочу выразить моё мнение по поводу Layout. Почему все её так кичатся? Каких то 1,4м против сотен мегабайт проффесиональных CAD, не наш уровень glare.gif ! Однако если сравнить одинаковые сервисы c тем же PCAD, то имхо, в первом они гораздо удобнее. Надо сравнивать по аналогичным сервисам, тогда оценка будет более, менее объективной. Понятно, что в PCAD намного больше сервисов, которых в LayOut просто нет. Но этот одинаковый фундамент у PCAD, повторяюсь имхо, хуже. Вот почему мне он не понравился. С другими средами та же история. Кстати uVision идут по правильному пути. Пути максимальной настройки среды. У всех разные стереотипы. И вижн постарался их не ломать. Думаю, среды в которых будет такой подход, будут обречены на популярность (о как выразился!).
Письмо с кряком высылаю. Лови! smile.gif Всем a14.gif
sonycman
2Alex_inventor
Спасибо за кряк. Музыка и правда ничего. Люблю я мызыку smile.gif

Сейчас вот меня интересует вопрос отладки.
Везде пишут, что отладчики загружают программу в RAM, а не во флеш. Ну это понятно - можно много точек останова поставить.

Но вот как-же может работать программа в памяти, когда она предназначена для выполнения во флешке? Там же при инициализации выделяется и очищается место в RAM под стёк и переменные. А тут по этому месту сама программа будет. Она же затрёт сама себя!
Вот это мне не понятно.
Другое дело, если проект изначально готовить для размещения в оперативе - стёк и переменные отодвинуть на другой конец памяти, и программу тогда можно перекидывать на начало RAM.
Andy Great
Все примеры отлично работают, только их надо брать из ветки GNU. Лучше не ставить пакет в каталоги с пробелами. Для стыковки некоторых GNU компиляторов подойдет это. Возможно, понадобится указать дополнительные параметры компиляции, например -mno-fpu для ассемблера (об этом на сайте и в форумах Кейла можно почитать). А вообще, указывайте GNU-сборку Вашу: их несколько, и для некоторых надо больше постараться. ИМХО GNUARM проще всего прилепить.
Alex_inventor
Я не специалист, но попробую объяснить как я понял. Во-первых, само ядро – микропроцессор – “фоннеймовская” архитектура. Т.е. шина данных и адреса одна. Проца не интересует, что есть flash или ram. Он инкрементирует PC и по адресу берёт команду, а что это Flash, Ram, или что другое его не касается. Это уже проблемы железа. Если в команде есть адрес данных то он по этой же шине запрашивает данные, а куда его этот адрес приведёт в Ram, Flash или в “тьму тараканью”, уже не его проблемы. Это проблемы компилятора и кодера(в некоторых случаях). Поэтому и существуют такие вектора как Undef_Addr, PAbt_Addr, DAbt_Addr. Для выполнения программы в RAM необходимо согласовать адреса стеков, и переменных. В принципе это делает компилятор. Ты только резервируешь переменные, а компилятор сам их распределяет. Для того чтоб компилятор разместил функцию в RAM в Keil компиляторе есть директива __ram. В RealViwe не помню (или не знаю). Вообще ram, как правило, маленькая и много туда не поместится. При загрузке в проц, тоже надо делать специальные телодвижения. Слышал что, напрямую не получится, надо писать свой загрузчик. (может я не прав). Я никогда не делал подобную процедуру. У меня даже нет физического камня. Эксперименты пока в Proteus делаю. По этому всё вышесказанное чистые умозаключения. Буду рад тоже выслушать мнения специалиста по данному вопросу.
Alex_inventor
2Andy Great
Компилятор я качал с keil.com. Он лежит на одной странице, где и сам uVision. Файл является установщиком (gccARM331.exe). Я ничего не настраивал, он сам установил себя в папку с:\ Cygnus и ещё некоторые манипуляции с реестром, по-моему, проделал. На диске есть готовые проекты. В каждом проекте в настройках указан GCC. Так вот, если я нажимаю компиляцию, то выскакивает ошибка. Проекты необходимы только для использования при прочтении книги, и всё! В чём причина разбирается, не хочу (осваиваю RealViwe). Повторяюсь, это не отдельные файлы, а целые проекты, с настройками компилятора и т.д. По этому всё сразу должно заработать. Сей факт пусть остаётся на совести автора.
P.S. В некоторых проектах настолько очевидные ошибки, что становится понятно, что автор их никогда и не компилировал. Например использование putchar(), а #include<stdio.h> и в помине нету.
sonycman
2Alex_inventor
Да, я бы тоже был бы рад послушать спецов, только они последнее время все пропали куда-то.
Мы с тобой одни остались sad.gif

Спасибо за помощь.
Я это всё понимаю.
Просто на IXBT почитал, что небольшие программки (типа как примеры в книге) можно загрузить прямо в рам (для отладки).
Да, наверное, для этого надо задать в компиляторе или линкере соответствующие адреса для стёка и переменных, чтобы они на программу не наложились...
Но как это сделать? RV компилятор даже не имеет возможности задать стартовый блок памяти как RAM. Только FLASH. Так что непонятного ещё много...
Насчёт записи программы в проц - из той-же книги - через утилиту Philips LPC2000 Flash Utility. Всё просто, как мне показалось.
А у SAM7 другой загрузчик - SAM-BA.

Я тоже пока чисто теоретизирую. Только не в Протеусе, а в симуляторе Кейла упражняюсь. Вещь кстати зверская - возможностей куча.

По компилятору - я даже браться за GCC не буду. Есть ведь RV - один из лучших, вроде. Только освоить надо.
RV сильно отличается от CARMа и, наверное, от GCC.
Примеры для него есть в папке Микровижн: C:\Program Files\Keil\ARM\RV30\Examples\

Цитата(Alex_inventor @ Jan 27 2007, 18:48) *
P.S. В некоторых проектах настолько очевидные ошибки, что становится понятно, что автор их никогда и не компилировал. Например использование putchar(), а #include<stdio.h> и в помине нету.

Это возможно потому, что putchar() там у автора своя, и ей не нужна стандартная библиотека.
zltigo
Цитата(sonycman @ Jan 27 2007, 17:01) *
я бы тоже был бы рад послушать спецов, только они последнее время все пропали куда-то.

Очень хорошо варитесь в "собственном соку" smile.gif сами задаете, сами ищите, сами отвечаете...
Это нормальный и правильный этап освоения нового.
Когда вопросы станут с более неочевидными ответами и схлынет их критическая масса, думаю и помощь подоспеет.
sonycman
Цитата(zltigo @ Jan 27 2007, 19:17) *
Очень хорошо варитесь в "собственном соку" smile.gif сами задаете, сами ищите, сами отвечаете...
Это нормальный и правильный этап освоения нового.
Когда вопросы станут с более неочевидными ответами и схлынет их критическая масса, думаю и помощь подоспеет.


Слава богу, мы не одни ! smile.gif

Скажите пожалуйста, MT-LINK будет работать с Keil uVision RealView ?
Вроде должен через RDI драйвер?

Если да, то я, наверное, закажу его на терраэлектронике...
zltigo
Цитата(sonycman @ Jan 27 2007, 17:40) *
Скажите пожалуйста, MT-LINK будет работать с Keil uVision RealView ?
Вроде должен через RDI драйвер?

И на этот smile.gif вопрос несколько раз на этом форуме ответ был - через RDI - будет.
Ответы на вопросы где взять RDI к MT-Link и как его зарегистрировать - тоже найдете на этом форуме smile.gif
sonycman
Цитата(zltigo @ Jan 27 2007, 20:11) *
И на этот smile.gif вопрос несколько раз на этом форуме ответ был - через RDI - будет.
Ответы на вопросы где взять RDI к MT-Link и как его зарегистрировать - тоже найдете на этом форуме smile.gif

Это хорошо smile.gif
Почти всё нашёл, кроме одного - нигде нет кряка для RDI.
Почему-то все ссылки на него на Сахаре нерабочие.
А в "своих" я пока не состою... sad.gif
Если не трудно, отправте, плиз, на мой ящик этот rdikeygen - sonycman(собака)mail(тчк)ru
Заранее спасибо smile.gif
Alex_inventor
Кстати, ещё одна ниточка в решение проблемы размещения в RAM. В файле определении регистров, в моём случае lpc210x.h, есть следующие строки:
/* Vectored Interrupt Controller (VIC) */
#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000))
#define VICFIQStatus (*((volatile unsigned long *) 0xFFFFF004))
#define VICRawIntr (*((volatile unsigned long *) 0xFFFFF008))
#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C))
#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010))
#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014))
#define VICSoftInt (*((volatile unsigned long *) 0xFFFFF018))
* * *
Т.е. объявляются переменные-адреса. Volatile-по некоторым данным переменная находящиеся в энергозависимой памяти (т.е. RAM). Кто ни будь объяснит что это за синтаксис такой? И за чем его в данном случае применять. Есть предположение что это нужно компилятору для переразмещении адресов в случае разных типов памяти, RAM, FlASH, EXT RAM?
sonycman
Цитата(Alex_inventor @ Jan 27 2007, 20:57) *
Есть предположение что это нужно компилятору для переразмещении адресов в случае разных типов памяти, RAM, FlASH, EXT RAM?

Не совсем.
Volatile чем-то похож на Const.

Вот что я вычитал из своего нового справочника по C++:
Квалификатор volatile сообщает компилятору, что значение переменной может изменяться неявно.
Например, адрес глобальной переменной можно передать таймеру операционной системы и использовать его для отсчёта реального времени. В этом случае содержимое переменной изменяется без явного выполнения какого-либо оператора присваивания.
Это очень важно, поскольку большинство компиляторов языка С/С++ автоматически оптимизируют некоторые выражения, считая, что значения переменных не изменяются, если они не указаны в левой части оператора присваивания и т.д.

То есть к флешке и к оперативе эти адреса не имеют никакого отношения.
Это адреса регистров периферии, и volatile стоит, видимо, для того, чтобы компилятор не наделал ошибок при оптимизации кода.
Alex_inventor
Столкнулся с проблемой. Есть например в проекте два файла (one.c , two.c). В one.c присоединяю файл определений lpc2xxx.h и two.c. Так вот во время компиляции определения файла lpc2xxx.h не видны в файле two.c. C функциями та же проблема. Когда работал с AVR, проблемы не было. Надо было только порядок подключаемых файлов соблюсти. Т.е. если в файле используется какая то функция другого файла, то тот другой файл должен быть присоединен раньше. Компилятор (RealViwe)
Alex_inventor
2 sonycman
Спасибо за разъяснение, хотя не совсем понятно. Нет, этo:
[/quote] , для того, чтобы компилятор не наделал ошибок при оптимизации кода. [/quote]
мне понятно. Но я не могу понять где компилятор может напортачить. Const и в Африке const. Конечно, если написать x=2+3, то компилятор соптимизирует в x=5. Но если мы напишем adr+5, и компилятор соптимизирует, ведь это не будет являться ошибкой. Похоже это фичи С++. Я знаю только С. Пока писал осенило! Только обратил внимание, что это типичное объявление #define, причём здесь переменная? Созрел вопрос к нашим гуру: А почему в определениях адресов регистров используется такой экзотический способ, а не банальное #define? Или этот вопрос не достоин Вас? Ну тогда извините sad.gif
sonycman
2Alex_inventor
Смотри: допустим, мы читаем данные из регистра статуса VIC через обычный, не-volatile указатель.
Потом идут какие-то действия. И тут нам снова надо обратиться к этому регистру. Так вот - компилятор не будет повторно обращаться к регистру периферии, а использует уже прочитанное до этого (и сохранённое в одном из регистров CPU) значение. А оно уже может не соответствовать действительности, так как данные могли неявно (контроллером прерываний) измениться.
Квалификатор volatile заставит компилятор сгенерить команду повторного чтения именно из регистра периферии. smile.gif
Alex_inventor
2sonycman
Давай для точности, разберёмся с определениями. Есть тип константа. Есть тип указатель. Есть макрос #define. В первом случае резервируется регистр (или кусочек RAM) и заносится туда значение (если мы проинитим, если нет то вообще смысл в const теряется). Пример const x=5, если x компилятор назначит R0, то выражение y=x; равносильно y=R0.(вообще не понимаю использования типа const, просто так регистр теряем, разве что на размере программ с экономим, если загрузка числа во flash будет больше чем загрузка из R0). С типом указатель всё понятно. В общих чертах штука “локальная”. Тип #define это макрос. #define x 1 везде, где будет встречаться =x, будет явно =1.
Адреса всей периферии фиксированные значения поэтому define использовать само то.

по-моему здесь допущена логическая ошибка:
…Смотри: допустим, мы читаем данные из регистра статуса VIC через обычный, не-volatile указатель.
Потом идут какие-то действия. И тут нам снова надо обратиться к этому регистру. Так вот - компилятор не будет повторно обращаться к регистру периферии, а использует уже прочитанное до этого (и сохранённое в одном из регистров CPU) значение….
Это будет выглядить примерно так:
Int *adr; //создаём указатель на переменную типа int
*adr=&x; //присваиваем переменной адрес x
y=*adr; //присвоить у=x
z=*adr; // здесь, судя по твоим размышлениям будет z=y, что не верно.
Если использовать ссылку то будет загружено значение, на которое указывает ссылка, на то она и ссылка, а не по-другому. Или я не прав?
Опять же, в упор не пойму использование ссылок на регистры. Хотя выражение:
#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) гибрид какой-то, не то ссылка, не то константа, не то число?
sonycman
2Alex_inventor
Давай smile.gif

Const - запрешает любые операции по изменению значения переменной. То есть это уже не переменная - это константа, определённая раз и навсегда.

#define - это вроде не макрос, а команда присвоения значения, как EQU в ассемблере.

Цитата
y=*adr; //присвоить у=x
z=*adr; // здесь, судя по твоим размышлениям будет z=y, что не верно.

Мы ведь говорим об ОПТИМИЗАЦИЯХ компилятора! Поэтому верхнее выражение будет вернее всего после компиляции таким:
LDR R0, [PC, #20] - грузим указатель
LDR R1, [R0] - грузим у
MOV R2, R1 - грузим z
так как указатель один и данные по этому указателю равны (!), какой смысл тратить драгоценные такты на повторное обращение к памяти?
А вот именно volatile не даст сгенерить такой код.
Я это так понимаю smile.gif

Цитата
#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) гибрид какой-то, не то ссылка, не то константа, не то число?

Там просто указатель на указатель на беззнаковое 32 битное значение smile.gif

В памяти будет находиться 32 битное слово со значением 0xfffff000, которое при вызове будет загружено в регистр процессора, после чего он считает данные, на которые будет указывать этот регистр:
LDR R0, [PC, #100] - R0 = 0xfffff000 (считано с адреса [PC+8+100])
LDR R1, [R0] - а теперь читаем периферию.
Alex_inventor
Если быть точным, то EQU-это директива компилятора. Вводит названия для чисел. Например pi EQU 3.14. #DEFINE это макрос(по крайней мере в RealView). Команда для macro-процессора. Выполняется перед компиляцией. Чем отличается? В макрос можно передавать данные. Например #define sum(x,y) x+y превратится в inline функцию. Если использовать #defne x 3 то она будет эквивалентно EQU. Если использовать #define x 100+300+200 то это тоже превратится в EQU. Я макрос использовал в подпрограмме delay. Класно получилось. Выложу проект когда разберусь с проблемой распределения имён между файлами.
Весь прикол в const, то что это как раз переменная. Кто сказал, что переменная не может быть константой? Есть же старый новый год biggrin.gif Под константу резервируете память и туда заносится значение. И объявление соответствующее const int x. А в программе, где нужна константа, вставляется не конкретное значение, а эта переменная. Косвенная адресация какое-то.
Блин, мозги пухнут когда пытаюсь разобраться в это путанице. Ладно, попробуем.
Int y,z; зарезервирует 2 регистра в банке, например R1,R2 (Кстати в CodeVision компилятор в комментариях указывал какие регистры он резервирует, очень удобно. Я этим постоянно пользовался когда в С вставке на asm вставлял)
Int *adr; зарезервирует переменную в банке регистров, ну например R0
y=*adr; превратится в LDR R1, [R0]
если сразу за этим будет x=y, всё будет корректно (правда смысла нет). Рассмотрим если между операторами будет ещё что ни-будь. Ну например:
y=*adr; LDR R1, [R0]
y=0; MOV R1, 0
x=*adr; LDR R2, [R0]
Цитата
так как указатель один и данные по этому указателю равны (!)

Вообщем компилятор не знает равны там данные или нет. Ведь указатель это переменная. Мы можем занести любой адрес. Тогда получается, что любой адрес будет одинаковым, неверно, хотя реально! biggrin.gif smile.gif Давай пофантазируем (да и посмеёмся biggrin.gif smile.gif ) где здесь может компилятор соптимизировать. Допустим это константный указатель (который нельзя изменить) на константу. Тогда вместо косвенной загрузки LDR R1, [R0] будет вставлено уже вычисленное выражение, например MOV R1, 5. Хотя какая это оптимизация? Ну я незнаю тогда… И ещё тут просто причин нет для оптимизации. Ведь при присвоении значению х по указателю, не превращает x в указатель.
Короче говоря истина рождается в спорах. Подискутируем, может найдём верный ответ.
Цитата
Там просто указатель на указатель на беззнаковое 32 битное значение

В памяти будет находиться 32 битное слово со значением 0xfffff000,
А где в памяти? Т.е. банальное const. Смысл использования которого я подвергал под сомнение выше. Тогда написали бы const int 0x123456. Да и указатель ли это? Внутри звёздочка справа стоит, для указателей слева ставится. Жду замечаний. smile.gif
sonycman
2Alex_inventor
Можно тебя спросить, как давно ты начал программить на С? smile.gif

Цитата
Внутри звёздочка справа стоит, для указателей слева ставится.

Вторая звёздочка тоже стоит слева от значения - (volatile unsigned long *) 0xFFFFF000
Это называется приведение типов (cast). smile.gif

Цитата
Вообщем компилятор не знает равны там данные или нет.

Знает. В этом состоит суть оптимизации кода при компиляции.

Цитата
Ведь при присвоении значению х по указателю, не превращает x в указатель.

Зато перед этим надо загрузить этот самый указатель из памяти.

Цитата
В памяти будет находиться 32 битное слово со значением 0xfffff000,
А где в памяти?

Да где угодно, это не важно, я просто пример привёл.
Начни отлаживать любой проект в дебаггере - посмотри, откуда грузится в PC вектор RESET.

Цитата
Т.е. банальное const. Смысл использования которого я подвергал под сомнение выше. Тогда написали бы const int 0x123456.

Ты лучше тогда почитай любую книжку по С, раз я не могу объяснить...
Alex_inventor
На С работаю около года. Исключительно на микроконтроллерах. До этого программировал на asm. Прошёл путь PIC, MSK-51, AVR, вот теперь очередь до ARM дошла.
Теперь по существу.
(*((volatile unsigned long *) 0xFFFFF000))

volatile unsigned long *

*((volatile unsigned long *) 0xFFFFF000)

Я убрал парные скобки чтоб до звёздочек добраться и где звёздочки находятся?

Цитата
Это называется приведение типов (cast).


Что такое приведение типов я прекрасно знаю. Перечитал главу в K&R (2.7 Преобразование типов.) Вырезки приводить не буду, но звёздочек там не встречал. Что такое cost прочитал впервые. Никогда не пользовался по причине слишком специфичности данной операции. Выражение (unsigned long ) 0xFFFFF000 есть пример cost. Но что делает звезда справа, и что на самом деле volatile обозначает? И зачем для адреса применять тип long(64bit), или в RealViwe long(32bit)?

Цитата
Знает. В этом состоит суть оптимизации кода при компиляции.

Как компилятор может знать заранее значение переменной, на которое указывает указатель? Или мы друг друга не понимаем?
Я много раз видел, как и что оптимизирует компилятор (я говорю про оптимизацию по размеру кода). Общие принципы оптимизации по пальцам пересчитать можно. Основная оптимизация это создание массива одинаковых кодовых последовательностей. И прыгание туда и обратно из программы. Далее идёт заранее вычисление выражений, которые можно просчитать до компиляции, в такие выражения не входят переменные, оптимизация сокращения кода, результаты которого одни и теже. Например r0=1; r0=1; Такая ситуация часто встречается при инициализации периферии в которой, в качестве защиты сделана необходимость дважды занести значения в регистр. В таких случаях выключают оптимизацию перед выражением и включают после. Ну и рискованный тип оптимизации, и как правило редко применяющейся, замена блоков кода, который по мнению компилятора выполняет определённый алгоритм, другим, оптимизированным, блоком кода выполняющий тот же алгоритм. Ни один из этих видов оптимизации не должен исказить загрузку по ссылке. Если я не прав приведите пример. Обсудим.

Привожупример дизассемблера:
LDR PC, Reset_Addr
Reset_Addr DCD Reset_Handler

Теперь становится понятно. Это особенности инструкции LDR. Она неможет включать в себя число, ну например как в AVR сделано – если идёт загрузка данных, то следующий за инструкцией байт это байт данных. LDR косвенно загружает регистр PC используя метку Reset_Addr, которая указывает на директиву резервирования и инициализации памяти DCD которая заносит число Reset_Handler которое проинициализировано EQU . Во какая цепочка! Самое интересное, что я давно обратил внимание на такое странное кодирование. А выражение (*((volatile unsigned long *) 0xFFFFF000)) это и делает. Но сама запись сбивает с толку. Я бы написал так flash int adr 123, ну или const int adr 123. В данном случае const уместна. Я же говорил в спорах рождается истина smile.gif .

Цитата
Ты лучше тогда почитай любую книжку по С, раз я не могу объяснить...


Да читал я книжки по С. Но я не читаю их от корки до корки (как например худ. литературу) по причине другого подхода. Я читаю те главы, которые мне нужны в данный момент. И обсуждаемую книгу я не прочитал. Прочитал главы общей архитектуры, инициализация, UART. Сейчас пишу проект с UART. В принципе написал. Всё работает за исключением некоторых мелочей. По мере появления вопросов читаю новые главы. Сейчас буду осваивать прерывания, ну и читать про них. Буду постепенно наращивать проект, пока не подключу всю периферию.
Всем a14.gif
Сергей Борщ
Цитата(Alex_inventor @ Jan 28 2007, 01:46) *
(*((volatile unsigned long *) 0xFFFFF000))
Но что делает звезда справа, и что на самом деле volatile обозначает?

Дословно *(unsigned long *) 0xFFFFF000 означает "значение типа unsigned long, на которое указывает указатель, содержащий адрес 0xFFFFF000". Или, что тождественно, "значение типа unsigned long, находящееся по адресу 0xFFFFF000". volatile заставляет компилятор при упоминании этого значения каждый раз считывать его заново, а не использовать сохраненное где-то считанное ранее значение.
Цитата(Alex_inventor @ Jan 28 2007, 01:46) *
Как компилятор может знать заранее значение переменной, на которое указывает указатель? Или мы друг друга не понимаем?
Если он это значение недавно прочитал, и сам с тех пор не менял, то вправе предположить, что значение осталось неизменным и использовать сохраненное значение, экономя такты и/или код на повторном обращении к памяти.
Цитата(Alex_inventor @ Jan 28 2007, 01:46) *
В данном случае const уместна.
const была приведена только как пример модификатора объявления переменной. С volatile const никак не связан, они существуют отдельно сами по себе.
Цитата(Alex_inventor @ Jan 28 2007, 01:46) *
Я читаю те главы, которые мне нужны в данный момент.
Ну хотя бы по диагонали остальные просмотреть стоит. Чтобы понять, в каких главах есть что-то для Вас новое и, следовательно, какие главы стоит просмотреть внимательнее. Я, например, сочетаю этот подход с другим - если мне что-то не понятно, читаю дальше. Потом возвращаюсь в начало и читаю снова. После двух прочтений в голове начинает формироваться некоторая картина, которая после трех-четырех приобретает осмысленные формы.
sonycman
2Alex_inventor
Я пробовал программить только PIC и AVR. smile.gif
Иногда на персоналке что-нибудь мелкое стряпаю.
Теперь вот тоже ARM захотелось пощупать smile.gif
Цитата
Сейчас буду осваивать прерывания, ну и читать про них. Буду постепенно наращивать проект, пока не подключу всю периферию.

Это ты всё в Протеусе делаешь?
Кстати, чем планируешь отлаживать девайс? Каким аппаратным дебаггером? Я вот думаю MT-Link заказать, но кряка для RDI драйверов под Keil нигде не могу найти sad.gif

2Сергей Борщ
Спасибо за помошь smile.gif

Сколько у ARMов регистров управления портами ввода-вывода ! Штук двадцать, наверное! Для каждой функции один для установки битов, другой для снятия, третий для статуса. Пока все аббревиатуры запомнишь ! smile.gif

Разъясните, плиз, по прерываниям:
при возникновении какого-либо прерывания (FIQ или IRQ), по заданному вектору проц перенаправляется на процедуру обработки. Это понятно.
А при выходе из обработчика это прерывание разрешается автоматически, или это надо делать самому?
И, если программа пользователя работала в THUMB режиме, то будет ли корректно восстановлен этот режим при выходе из обработчика?
Имею ввиду, заложены ли эти механизмы аппаратно в ядро, или это всё надо делать ручками перед выходом из обработчика прерывания?
Alex_inventor
2 Сергей Борщ
Цитата
Ну хотя бы по диагонали остальные просмотреть стоит.

А я и не отрицал этого. Разумеется я просматриваю подробно оглавление и мельком каждую главу. Это необходимое условие что бы иметь общее представление и возможность ориентации. По-другому никак. Иначе как оперативно найти нужные ответы? Углубленно изучаю только необходимые в данный момент главы. Вообщем как справочник.
Цитата
С volatile const никак не связан, они существуют отдельно сами по себе.

Объясните мне в чём такая принципиальная разница? Хотябы небольшая?
Цитата
volatile заставляет компилятор при упоминании этого значения каждый раз считывать его заново, а не использовать сохраненное где-то считанное ранее значение.

Зачем это делать? Какое сохранение времени, тиков? Чтение из flash одна инструкция процессора (LDR PC, Reset_Addr)
Цитата
а не использовать сохраненное где-то считанное ранее значение.

Как это понимать? Если мы присвоим x=*adr, то что компилятор будет наивно полагать что переменная х никогда не изменится и будет использовать её как источник адреса? Хотя выигрыша мы не получим, нельзя оптимизировать одну инструкцию процессора, если не выкинуть её вообще.
Извините, если кому-то покажется агрессивным стиль написание, так получилось. smile.gif
Цитата
Дословно *(unsigned long *) 0xFFFFF000 означает "значение типа unsigned long, на которое указывает указатель, содержащий адрес 0xFFFFF000". Или, что тождественно, "значение типа unsigned long, находящееся по адресу 0xFFFFF000".

Ну если быть точным, насколко я понял, то выражение полностью выглядит так:
#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000))
и означает определение метки VICIRQStatus которое указывает на облость памяти с константой u long имеющую значение 0xFFFFF000. Обращаю особое внимание на слова МЕТКИ, а не указателя. Метка это число, таже константа и менятся не может, а указатель это переменная и может указывать на что угодно в любой момент времени, смотря сто занесёшь туда.
Цитата
Если он это значение недавно прочитал, и сам с тех пор не менял, то вправе предположить, что значение осталось неизменным и использовать сохраненное значение, экономя такты и/или код на повторном обращении к памяти.

Дело в том, что компилятор не может недавно прочитать значение по ссылке . Ссылка это переменная. Недавно прочитать может только работающая программа. Когда компилятор уже давно сделал сваи дела и гордо удалился. biggrin.gif

В общем, подвожу итог: структура define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) разложена по полочкам, стала понятна, появилась осмысленная возможность её использование. Хотя некоторые аспекты так и не объяснены (например, расположение звезды справа). smile.gif
Alex_inventor
2sonycman
А у тебя proteus есть? Ты им когда-нибудь пользовался? Если нет, то не видел счастья в жизни!!! Хотя я тебя не виню, если это так. Сам случайно начал им пользоваться. Хотя в протеусе глюк на глюке и глюком погоняет, но всё равно это сказочная среда!!! Нужно просто ожидать от неё то, что она может тебе дать. Аналогов даже приблизительных у неё нет!!!
Вобщем если никогда не пользовался, то опишу кратко. Перед тобой экран на котором ты строишь электрическую схему. Интерфейс максимально интуитивно понятный, и максимально удобный. Короче ставишь проц. Там есть Philips 5 видов. Указываешь адрес прошивки, нажимаешь симуляцию… и вот тебе счастье!!! При этом на ноги навешиваешь куча разноцветных светодиодов, lcd всех видов, подключаешь к процу реальный COM компа и туда подключаешь железо, т.е твой виртуальный проц управляет реальным железом!!! Я так делал круто!!! Та же история и с LPT. Далее подключаешь виртуальный COM (который появляется в системе) и твоя прога на С++ подключившись к этому COM общается с процом. Далее подключаешь Несколько виртуальных терминалов. Ставишь микросхемы I2C, SPI, MMC на все шины вешаешь мониторы(типа отлеживать активность в текстовом виде по I2C) Включаешь виртуальные самописцы, осциллографы, вольтметры, амперметрыб подключаешь громкоговоритель и у тебя на звуковую карту выводится фигня с контроллера или куда ты там подключишь вывод. Ставишь ещё кучу контроллеров AVR, PIC, MSK-51, в каждом своя прошивка, подключаешь кучу микросхем жёсткой логики, ставишь кучу аналоговой логики (транзисторы, резисторы, конденсаторы и т.д.) И всё это без единой строчки писанины, выбираешь элемент и ставишь, ставишь, СТАВИШ!!! w00t.gif Картина РЕПИНА! Короче нажимаешь пуск и балдеешь от происходящей какофонии! w00t.gif И это малая возможность, что может среда. Стоит ли говорить, если она поддерживает эмуляцию десятка тысяч элементов. Там есть даже таки прикольные элементы как сенсорная ЖК панель 640x480. Там в примерах есть проект, где на АРМе и этой панели шахматы сделаны. Я играл, прикольно. Я выиграл biggrin.gif Правда машину надо мощную иметь. У меня 2.8Г шина 533МГ и то не хватает в некоторых случаях. Я куски кода только в нём отлаживаю, а потом в железо программирую, и как нистранно, сразу всё работает, без отладки!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.