Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-июл-23 21:11

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 2019-май-23 12:05 
Не в сети

Зарегистрирован: 2015-июл-29 18:34
Сообщения: 2
Возможно ли передать в процедуру адрес порта микропроцессора?

void setp (* Port)
{
*Port = 12345;
}

main
{
setp(&P1);
setp(&P2)
}
Примерно так


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-май-23 12:33 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 368
Откуда: ПКК "Миландр"
#define REG32(x) (*((volatile uint32_t *)(x)))

void Write(uint32_t addr, uint32_t flag)
{
REG32(addr) = flag;
}

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-май-23 23:08 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 63
Вам принципиален именно адрес? Т.е. беззнаковое целое? Именно целое число надо передавать в функцию?
Указатель на порт в качестве аргумента функции не устраивает?
Ваш код
Код:
main
{
setp(&P1);
setp(&P2)
}

оперирует именно указателями.
Т.е. P1 и P2 - это целочисленные переменные, а &P1 и &P2 - это указатели на них.
Чтобы работать с адресами, как с указателями, надо привести адрес порта (беззнаковое целое число) к типу указателя на целое и передавайте в функцию его.
Посмотрите, как это реализовано в SPL
Код:
#define PORT_E_ADDR 0x400C8000                      // адрес порта E
#define PORT_E ((uint32_t *)PORT_E_ADDR)  // указатель на порт E

// Запись значения NewVal по указателю на порт Port_ptr
void setp (uint32_t *Port_ptr, uint32_t NewVal) {
    *Port = NewVal;
}

main {
    setp(PORT_E, 0x1234);  // Запись в порт Е значения 0x1234
}

Если пишите на C++ используйте вместо макросов (директив #define) квалификатор constexpr
А для приведения целого числа к типу указателя reinterpret_cast
Код:
constexpr uint32_t PORT_E_ADDR = 0x400C8000;                  // адрес порта E
constexpr uint32_t *PORT_E = reinterpret_cast<uint32_t *>(PORT_E_ADDR);        // указатель на порт E


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-май-24 09:07 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 438
Цитата:
Возможно ли передать в процедуру адрес порта микропроцессора?

Давайте определимся о какой платформе идет речь.
Если о кортексах (серия 1986) тогда да. И в библиотеках это наглядно показано.
Если о серии 1886 - тогда нет, поскольку косвенная адресация к перефирии там отсутствует (насколько я помню PIC17).

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-май-24 18:43 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1310
Откуда: Тула
редактор писал(а):
...Если о серии 1886 - тогда нет, поскольку косвенная адресация к перефирии там отсутствует (насколько я помню PIC17).

Отчего же? Целых три вида адресации есть в pic17, другое что важно, порты разбросаны по разным банкам памяти.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-май-27 15:27 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 438
Цитата:
Если о серии 1886 - тогда нет

Цитата:
... Целых три вида адресации есть в pic17

Возможно я перепутал с другой архитектурой.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-май-29 14:42 
Не в сети

Зарегистрирован: 2015-июл-29 18:34
Сообщения: 2
Спасибо за ответы.
Принципиально то, что во время работы меняются ножки микропроцессора, поэтому я должен менять адрес регистра. #define не проходит


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB