Миландр

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

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 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
Сообщения: 456
Организация: Milandr
Откуда: ПКК "Миландр"
#define REG32(x) (*((volatile uint32_t *)(x)))

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


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

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 109
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
Вам принципиален именно адрес? Т.е. беззнаковое целое? Именно целое число надо передавать в функцию?
Указатель на порт в качестве аргумента функции не устраивает?
Ваш код
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
Сообщения: 465
Цитата:
Возможно ли передать в процедуру адрес порта микропроцессора?
Давайте определимся о какой платформе идет речь.
Если о кортексах (серия 1986) тогда да. И в библиотеках это наглядно показано.
Если о серии 1886 - тогда нет, поскольку косвенная адресация к перефирии там отсутствует (насколько я помню PIC17).

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

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


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

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

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


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

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 465
Цитата:
Если о серии 1886 - тогда нет
Цитата:
... Целых три вида адресации есть в pic17
Возможно я перепутал с другой архитектурой.

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

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


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

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


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

Часовой пояс: UTC+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB