Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите начать работать с Assembler
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Max-sceince
Ребята, помогите пожалуйста начать работать с ассемблером. У меня МК LPC2148 c ядром ARM 7. В чем заключается проблема: Не могу добится от МК высокой производительности если пишу код программы на С, поэтому решил написать код на assembler. Использую программу keil. Посоветовали скачать arm7tdmidatasheet.pdf. Скачал почитал. Примеры есть, но как и с чего начать писать, как связать и подключить нужные модули и т.д. Вообщем просто необходи какой-нибудь простой примерчик (например поморгать светодиодами только чтобы код программы был написан на assemble) или дайте ссылочку на какой нибудь проект где люди пишут на ассемблере. Буду вам весьма признателен!!! :-)
aaarrr
Боюсь, что Вы не стой стороны пытаетесь решить проблему. Может, сначала попробовать оптимизировать те участки, производительность которых не устраивает?
Max-sceince
aaarrr, оптимизировать то нечего все очень просто. МК использую для управления двигателем. Перед тем как написать полностью проект отлаживаю его составные части. Вот дошел до датчика скорости. На один оборот датчика скорости приходит 250 импульсов.
Написал программу
CODE
#include <lpc214x.h>
int i;
void T1isr(void) __irq;
void _PLL (void);
void _MAM (void);
int main(void)
{
int j;
i=0;
_PLL();
_MAM();
PINSEL1 =0x00000C00; //p0.21 vibran kak zahvat//
T1PR = 0x00000001; //Load prescaler for 1 Msec tick
T1TCR = 0x00000002; //Reset counter and prescaler
T1CCR = 0x00000A00; //Capture on rising edge of channe0.0
T1TCR = 0x00000001; //enable timer
VICVectAddr5 = (unsigned)T1isr; //Set the timer ISR vector address
VICVectCntl5 = 0x00000025; //Set channel
VICIntEnable = 0x00000020; //Enable the interrupt
IODIR0 =0x00000C00; //set p.10 and p.11 outputs
IO0SET =0x0C00;
j=0;
while(1)
{
if (i==250)
{
IO0CLR = 0x0400;
}
VICIntEnable = 0x00000020; //Enable the interrupt
for (j = 0; j < 500000; j++ ); // wait 500 msec
IO0CLR =0x0800;
for (j = 0; j < 500000; j++ ); // wait 500 msec
IO0SET =0x0800;
}

}

void _PLL (void)
{
PLL0CFG = 0x00000024; // ystanavliv koef ymnojenia i delenia for poluchenia chastoti 60MHz
PLL0CON = 0x00000001; // vkluchaem PLL
PLL0FEED = 0x000000AA; // obnovliaem registri
PLL0FEED = 0x00000055;
while (!(PLL0STAT& 0x00000400));// proveraiem flag lock
PLL0CON = 0x00000003; // podkluchaem PLL
PLL0FEED = 0x000000AA; // obnovliaem registri Pll
PLL0FEED = 0x00000055;
VPBDIV = 0x00000002; // Yctanablivaem chastotu chini VPB=30MHz
}
void _MAM (void)
{
MAMCR = 0x00000000;
MAMTIM = 0x00000004;
MAMCR = 0x00000002;
}
void T1isr (void) __irq
{
VICIntEnClr = 0x00000020;
i++;
T1IR = 0x00000080;
VICVectAddr = 0x00000024; //Dummy write to signal end of interrupt

}

Импульсы от датчика скорости подаю на ногу МК (p0.21) программирую её как capture 1.3 ()для TIMER1. Настраиваю TIMER1 таким образом чтобы при переходе c 0 на 1, МК входила в прерывание. В приревании инкременирую i(счетчик импульсов). в основном теле программы провиряю этот счетчик если он равен 250 то я включаю светодиод. На отладочной плате их у меня два. Один светодиод просто мигает, а второй показывает когда счетчик импульсов i насчитал 250 импульсов. Всё просто!!!!!
Заливаю программу в МК. Датчик делает кучу оборотов, только после этого загорается светодиод. Т.е. обработка тормозит. Импульсы МК пропускает! Думаю что программа написанная на С, тормозит МК. Какие пути оптимизации? Пожалуйста предложите, буду очень рад услышать конструктивную критику и не только!!! smile.gif
aaarrr
Цитата(Max-sceince @ Mar 21 2009, 18:49) *
Думаю что программа написанная на С, тормозит МК. Какие пути оптимизации? Пожалуйста предложите, буду очень рад услышать конструктивную критику и не только!!! smile.gif

Asm тут никак не поможет. Влетать на каждом импульсе в прерывание - это уже не самая лучшая идея, подойдет только для относительно низких частот. И зачем запрещать прерывание в обработчике и при этом периодически разрешать его в основном цикле???
Так что дело не в быстродействии, а в программе.
Max-sceince
Запрещаю прерывание в превании для того чтобы если МК находится в прерывании и на ногу пришел импульс то может возникнуть ошибка!!! МК необходимо будет зайти в прерывание, а он уже в нем! Вот поэтому я и запрещаю прерывание. aaarrr подскажите как можно другим способом подчитать импульсы от датчика скорости?
aaarrr
Цитата(Max-sceince @ Mar 21 2009, 19:13) *
Запрещаю прерывание в превании для того чтобы если МК находится в прерывании и на ногу пришел импульс то может возникнуть ошибка!!!

Не может.

Цитата(Max-sceince @ Mar 21 2009, 19:13) *
подскажите как можно другим способом подчитать импульсы от датчика скорости?

На LPC, насколько я помню, никак. Но можно задействовать вход внешнего прерывания с FIQ.
Andy Mozzhevilov
Цитата(Max-sceince @ Mar 21 2009, 20:49) *
счетчик если он равен 250 то я включаю светодиод. На отладочной плате их у меня два. Один светодиод просто мигает, а второй показывает когда счетчик импульсов i насчитал 250 импульсов. Всё просто!!!!!
Заливаю программу в МК. Датчик делает кучу оборотов, только после этого загорается светодиод. Т.е. обработка тормозит.

Вы бы сначала озвучили, с какой частотой у вас импульсы подаются на вход.
Max-sceince
Andy Mozzhevilov, На 1 оборот диска приходится 250 импульсов. Номинальная частота вращения двигателя 3000 об/мин. Т.е. за секунду на ногу МК будет приходить 125 000 импульсов, это приблизительно 125 кГц. Это максимальная частота. А на отладке программы я просто рукой вращаю датчик и приходится повернуть n-количество раз чтобы счетчик импульсов насчитал нужное количество импульсов. А это не правильно!!! Он за один оборот в программе должен уже подсчитать 250 импульсов и зажечь светодиод. А МК этого не делает.

aaarrr, спасибо за совет попробую, посмотрю что получется. Если вдруг у кого возникли какие-нибудь идеи подскажите, пожалуйста!
zltigo
Цитата(Max-sceince @ Mar 21 2009, 20:31) *
На 1 оборот диска приходится 250 импульсов. Номинальная частота вращения двигателя 3000 об/мин. Т.е. за секунду на ногу МК будет приходить 125 000 импульсов, это приблизительно 125 кГц.

Уже с арифметикой проблемы sad.gif - ошибка на порядок. Всего 12,5 kHz - целая вечность.
Цитата
А на отладке программы я просто рукой вращаю датчик и приходится...

Тогда точно ассемблер никак не поможет - явно нешуточные проблемы с подходом к делу. Прежде всего думайте, что нагородили, дабы заcтавить несчастный контроллер неуспевать считать.
Andy Mozzhevilov
В общем за 80 мкс на импульс можно его на 60 МГц не то что в прерывании хватать, а в RTOS в задаче обрабатывать.
Разбирайтесь с работой периферии, контроллера прерываний и иже с ними... Си оставте в покое, он не причем.
Max-sceince
zltigo, так вот именно что, вроде ничего не нагорожено. Все самое необжодимое прописано. А результат получается нехороший.
zltigo
Цитата(Max-sceince @ Mar 21 2009, 21:08) *
...ничего не нагорожено.

Смею Вас заверить со все определенностью, что это не так sad.gif
SysRq
Цитата(Max-sceince @ Mar 21 2009, 21:08) *
...вроде ничего не нагорожено.

С какой вероятностью в main() значение переменной i считается как ровно 250, если считывается (считывается ли? volatile нету...) новое значение переменной i раз в секунду, а инкременируется значение i с частотой (как правильно подсчитал уважаемый zltigo) примерно 12,5 kHz? smile.gif
Max-sceince
zltigo, а вы можете подсказать где неверно, либо дать направление в котором следует подумать? smile.gif Буду очень презнателен!!!
Max-sceince
Спасибо, SysRq понял свою ошибку!!! Заработало!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.