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

 
 
> Вопросы по программе на С, Программа для микроконтроллера
Makeda
сообщение Aug 9 2012, 18:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 9-08-12
Пользователь №: 73 076



Разбираю код для микроконтроллера на Си. Возникло пару вопросов.

1) Зачем нужны header файлы? На чем они написаны, если имеют расширение .h?

#include <reg8252.h>
#include "External.h"
#include "Interrupt.h"
#include "Timer.h"
#include "Memory.h"


2) #include <reg8252.h> подключается что? Как это правильно обозвать? Заголовочный файл с обозначение регистров специальных функций?

3) Это глобальная переменная?

extern bit IsWasInt;

Правильно ли описание.

4) Функция Delay объявлена на строке 12, она принимает без знаковый целочисленный аргумент типа int и ничего не возвращает. На четырнадцатой строке объявлен цикл while, которому в качестве условия выхода указан декремент локальной переменной i.

17) void Delay1ms(unsigned int i)
18) {
19) while(i--)
20) Delay(82);
21) }


12)void Delay(unsigned int i)
13) {
14) while(i--);
15) }
16) while(i--)

C:0x0344 EF MOV A,R7 ------ 1 цикл
C:0x0345 1F DEC R7 ------ 1 цикл
C:0x0346 AC06 MOV R4,0x06 ------ 1 цикл
C:0x0348 7001 JNZ C:034B ------ 2 цикла
C:0x034A 1E DEC R6 ------ 0 цикл
C:0x034B 4C ORL A,R4 ------ 1 цикл
C:0x034C 70F6 JNZ Delay(C:0344) ------ 2 цикла

8 циклов *12* 90 нс (11 МГц частота МК) * 82 = 0.708408 мс

Посмотрел на время выполнения в KeiluVision 4, результат не совпал 0,834550 мс


6) Что такое Build Target в KeiluVision 4? Создание сборки?

7) Следующая конструкция прописана в заголовочном файле c расширением .h. Не совсем понятно зачем используют в этом случае макрос b, почему когда переменной а присвоили значение P2^6, ее нельзя использовать в основной программе

sbit a = P2^6;
#define b a
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
_Артём_
сообщение Aug 9 2012, 21:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Makeda @ Aug 9 2012, 21:19) *
Разбираю код для микроконтроллера на Си. Возникло пару вопросов.

1) Зачем нужны header файлы? На чем они написаны, если имеют расширение .h?

Написаны должны быть в соответствии с синтасисом Си.
Содержат: прототиты функций, переменных, определения типов, констант и проч.

Цитата(Makeda @ Aug 9 2012, 21:19) *
2) #include <reg8252.h> подключается что? Как это правильно обозвать? Заголовочный файл с обозначение регистров специальных функций?

В основном там регистры-порты процессора 8252.
Откройте и посмотрите.

Цитата(Makeda @ Aug 9 2012, 21:19) *
3) Это глобальная переменная?
extern bit IsWasInt;
Правильно ли описание.

Глобальная.
Вроде правильно, в кейле был такой тип.
Но тип bit поддерживается немногими компиляторами.

Цитата(Makeda @ Aug 9 2012, 21:19) *
8 циклов *12* 90 нс (11 МГц частота МК) * 82 = 0.708408 мс

Посмотрел на время выполнения в KeiluVision 4, результат не совпал 0,834550 мс


Проверяйте в железе, может неправильно посчтали такты.

Цитата(Makeda @ Aug 9 2012, 21:19) *
7) Следующая конструкция прописана в заголовочном файле c расширением .h. Не совсем понятно зачем используют в этом случае макрос b, почему когда переменной а присвоили значение P2^6, ее нельзя использовать в основной программе

sbit a = P2^6;
#define b a


Использовать можно:

Код
unsigned char A;

void main()
{
A=b;
}

Не знаю правда зачем ...
Как вы пытаетесь её использовать?
P.S. Объявлять переменные в хидерах - плохая практика.
Go to the top of the page
 
+Quote Post
Makeda
сообщение Aug 9 2012, 21:43
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 9-08-12
Пользователь №: 73 076



Цитата
Не знаю правда зачем ...
Как вы пытаетесь её использовать?
P.S. Объявлять переменные в хидерах - плохая практика.


В программе используется как макрос, просто там где нужно значения с порта P2^6 пишется b. Вопрос зачем использовать макрос?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 9 2012, 22:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Makeda @ Aug 10 2012, 00:43) *
просто там где нужно значения с порта P2^6 пишется b.

P2^6 - это чтение входа или что?
Или P2 xor 6?


Цитата(Makeda @ Aug 10 2012, 00:43) *
Вопрос зачем использовать макрос?

Странный макрос (или я 51-ые забыл совсем?).
Чтобы прочитать нужно было подать в порт 1, а потом читать, кажется.
Код
P2=1;
unsigned char port_2=P2&1; // чтение бита 0

Как оно у вас в программе выглядит?
Go to the top of the page
 
+Quote Post
редактор
сообщение Aug 10 2012, 07:48
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Цитата
P2^6 - это чтение входа или что?
Или P2 xor 6?

Keil таким образом объявляет битовую переменную бит 6 в регистре P2. Возможно только для регистров имеющих битовый доступ (SFR с адресом, кратным 8 или переменные расположенные в области BDATA)
С именами a,b,c советую быть поосторожнее, поскольку Keil может спутать с предопределенными именами регистров и бита переноса.


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
Makeda
сообщение Aug 10 2012, 14:48
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 9-08-12
Пользователь №: 73 076



Цитата
Keil таким образом объявляет битовую переменную бит 6 в регистре P2. Возможно только для регистров имеющих битовый доступ (SFR с адресом, кратным 8 или переменные расположенные в области BDATA)
С именами a,b,c советую быть поосторожнее, поскольку Keil может спутать с предопределенными именами регистров и бита переноса.


С sbit a = P2^6 понятно, спасибо.
А зачем все таки макрос используют?

#define b a

Нельзя ли без него, использовать переменную a в самой программе.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 10 2012, 17:10
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Makeda @ Aug 10 2012, 17:48) *
Нельзя ли без него, использовать переменную a в самой программе.
Можно. Компилятор делает тупую текстовую подстановку. Но когда в процессе макетирования или в следующем проекте вы захотите перенести этот сигнал с P2^6 на P2^5, проще поменять один #define, чем ползать по всем исходникам. И нет риска по невнимательности оставить в каком-то месте программы P2^6 и потом долго медитировать - почему программа перестала работать.
Кроме того, читая чужую (или свою через несколько дней) программу и встретив, скажем, выражение variable = KEY_OK; вы сразу поймете, что здесь читается кнопка OK, а встретив variable = P2^6 - будете отвлекаться и заглядывать в схему.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Makeda
сообщение Aug 13 2012, 21:04
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 9-08-12
Пользователь №: 73 076



Почему тип Char используется в аргументе функции, думал он только для символов, а в Dat педается восьмиразрядное число. Так можно?

Цитата
void SetRK(unsigned char Dat)
{

unsigned char t=Dat;
SetPage(CTRL_REG_PAGE);
RK=t;

}
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Aug 13 2012, 21:20
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



char - это обычное целое число размером достаточным чтобы вместить ASCII символ - 8 бит. В арифметике/логике идентичны int.
Почитайте уже наконец K&R https://www.google.com/search?q=k%26r+c+pro...lient=firefox-a или любой другой букварь по Си.


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
Makeda
сообщение Aug 14 2012, 22:00
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 9-08-12
Пользователь №: 73 076



Подскажите что значит code const и для чего такая конструкция при объявлении массива.

Цитата
code const unsigned char OBZ_L[OBZ_L_LENGTH]
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 14 2012, 22:57
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Makeda @ Aug 15 2012, 01:00) *
Подскажите что значит code const и для чего такая конструкция при объявлении массива.

Нужно смотреть в описании компилятора.
Но, думаю не ошибусь, если предположу что таким образом объявленная переменная (с ключевым словом code) окажется не в ОЗУ, которого мало, а во flash-памяти, которой больше. Экономия.
Go to the top of the page
 
+Quote Post

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

 


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


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