Свежие обсуждения
Микроконтроллеры

Простейшая программа в Code Composer (вопрос по LDPK)

Здравствуйте! Я в этом деле новичок, хочу узнать кое-что непонятное для меня,если Вам не сложно, ответьте.

Вот написал простенькую программу:

========================================
#include <stdio.h>

unsigned int fzcount;

void main()
{
for (fzcount=15;fzcount>0;fzcount--)
{
printf("fzcount = %d \n",fzcount);
}
}
=========================================

Сгенерировал asm файл: (В скобках вопросы)
=========================================
_main: ......

LACK 15
LDPK _fzcount
SACL _fzcount
LAC _fzcount
BZ L2 (Для чего нужно это условие, если я явно задал, что fzcount изменяется от 15 до 0, можно ли как-нибудь от этого избавиться?)
L1: /*
BLKD _fzcount+0,*+
LRLK AR3,SL0
SAR AR3,*+ Печать результата.
CALL _printf
SBRK 2 */

LDPK _fzcount (Я так понимаю, что на рабочую страницу загружается const с другой странице. Можно ли Composer'у указать что эта константа на той же странице?? как это сделать?)
LAC _fzcount
SUBK 1
SACL _fzcount
LAC _fzcount (Не понимаю, для чего нужно второй раз загружать в аккумулятор fzcount, там и так находится это значение - это попросту лишнее действие, как можно от этого избавиться??, и почему компилятор так делает??)
BNZ L1
L2: ..........
=================================
На мой взгляд, программа будет выполняться и так :
==================
LACK 15
LDPK _fzcount
SACL _fzcount
L1:
LAC _fzcount
SUBK 1
SACL _fzcount
BNZ L1
==================
Пожалуйста, кто что знает, помогите разобраться в этом.

 

1. В любом сишном компиляторе есть блок оптимизации. Попробуйте поиграться ключами оптимизации. Обычно это -On (n=0,1,2,3 или s). У Вас сейчас, скорее всего, -O0, т.е. оптимизации нет никакой.
2. Первое "для чего" - компилятор в данном случае просто строго следует стандарту языка. Цикл for - цикл с предусловием, т.е. может выполняться любое число раз, в том числе и ни одного. Думаю, при соответствующей оптимизации это условие будет выкинуто.

 

Большое спасибо за помощь. Похимичел я над ключами оптимизации, и для BZ L2 , LAC _fzcount помогло, но вот LDPK _fzcount никак(...... Кто-нибудь может подсказать?

 

И еще один вопрос: Как узнать время выполнения функции ну или всей программы, чего-то пытался разобраться, но никак не получается(

 

Возможно, стоит попробовать в качестве параметра цикла локальную переменную. Как правило, локальные и глобальные переменные выделяются из разных областей памяти. Внесите объявление fzcount внутрь main, посмотрите, что получится. Можно к объявлению переменной цикла приписать "register", иногда помогает (если ресурсы микроконтроллера позволят). Насчет времени выполнения - сложно сказать, проще попробовать "вживую". Всякие трассировщики производительности именно так и работают - замеряют время работы функции в реальных условиях.

 

Dimanbel333: Похимичил я над ключами оптимизации, и для BZ L2 , LAC _fzcount помогло, но вот LDPK _fzcount никак
Компилятор делает всё правильно, поскольку перед выполнением LDPK _fzcount вызывалась функция CALL _printf, и компилятор не уверен, что страница не изменилась. Поэтому он вставил команду с настройкой страницы.

Dimanbel333:
LAC _fzcount (Не понимаю, для чего нужно второй раз загружать в аккумулятор fzcount, там и так находится это значение - это попросту лишнее действие, как можно от этого избавиться??, и почему компилятор так делает??)

Можно обойтись без второй загрузки, видимо, старый компилятор, делает всё последовательно: уменьшил счётчик цикла, сохранил, потом проверил счётчик цикла...

Что у вас за процессор, и странно что присутствует команда SBRK?

 

1.
chav1961: Возможно, стоит попробовать в качестве параметра цикла локальную переменную. Как правило, локальные и глобальные переменные выделяются из разных областей памяти. Внесите объявление fzcount внутрь main, посмотрите, что получится.

Это я уже пробовал и конечно все получалось хорошо, но кроме одного, хотелось бы чтобы код был более наглядный, чтобы я видел, что это за переменная, в моем случае это fzcount. А здесь, я так понимаю, работа уже с регистрами. Код ниже:

==============================
LACK 8
LARK AR2,1
MAR *0+
SACL *

LAC *
BZ L2
L1:
LAC *
SUBK 1
SACL *
LAC *
BNZ L1
==============================

2.
chav1961: Можно к объявлению переменной цикла приписать "register", иногда помогает

К глобальной переменной не получилось добавить, выдал ошибку: [F072] unrecognized register name 'fzcount', а вот к локальной получилось, код еще больше оптимизировался, но это опять, как я уже говорил, работа с регистрами.

3.
chav1961: Насчет времени выполнения - сложно сказать, проще попробовать "вживую". Всякие трассировщики производительности именно так и работают - замеряют время работы функции в реальных условиях
В реальных условиях пок не получается(( нет оборудования. Ладно, этот вопрос пока меня не сильно интересует.

4.
GM: Компилятор делает всё правильно, поскольку перед выполнением LDPK _fzcount вызывалась функция CALL _printf, и компилятор не уверен, что страница не изменилась. Поэтому он вставил команду с настройкой страницы.

Даже если вообще убрать функцию распечатки, страница все равно будет загружаться(((
/* От этого LDPK вообще никак не избавиться, чтобы я не пробывал(((((( */

5.
GM: Можно обойтись без второй загрузки, видимо, старый компилятор, делает всё последовательно: уменьшил счётчик цикла, сохранил, потом проверил счётчик цикла...
Что у вас за процессор?

Процессор TMS320C25. Знаю что старый, но просто мне сказали что для начала и этот подойдет.

6.
GM: и странно что присутствует команда SBRK?

С этим не разбирался, на код распечатки вообще не смотрел, так как ввел эту функцию просто для проверки правильности счета.