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

 
 
> посоветуйте алгоритм
romez777
сообщение Jun 28 2010, 10:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую,

пишу библиотеку к Layer-2 24-портовому свитчу (25 порт - внутренний для связи с cpu), и одна из функций - VLAN. Неудобство в том, что каждый порт представлен двумя регистрами: один 16 битный, второй - 9бит. Каждый из этих регистров имеет такой смысл (цитирую даташит): "the ports which p1~p25 can forward to". Для примера:

порты {5, 6, 7, 8, 25} помещаем в vlan группу 1, соответственно пишем следующие рег-ры:

reg5-1 to 0x00f0, reg5-2 to 0x100 (for port 5)
reg6-1 to 0x00f0, reg6-2 to 0x100 (for port 6)
reg7-1 to 0x00f0, reg7-2 to 0x100 (for port 7)
reg8-1 to 0x00f0, reg8-2 to 0x100 (for port 8)
reg25-1 to 0x00f0, reg25-2 to 0x100 (for port 25)

Стал сочинять ф-цию и застрял:

int vlan_port_add(int unit, unsigned int vid, unsigned int port)
{
int p;
long portmask;
uint16_t val;

portmask = getPortmask(vid); /* current bitmask stored in NVRAM */
portmask |= 1 << (port - 1);
savePortmask(vid, portmask);
mask = portmask;

for (p = 0; p < PORT_MAX; p++) {
if (mask & 1) {
addr = R_VLAN_ENTRY_BASE + (p * 2); /* evaluate register address */
val = portmask & 0x0000ffff;
writeReg(unit, addr, val);
/* XXX */
}
mask >>= 1;
}
...
}

Но этот код правильно работает только для младших битов. Т.е. пробегая по маске, записываем в регистры, соответствующие установленным битам, и если доберемся до битов 17-24, и порты им соответствующие, должны быть в VLAN группе вместет с портами, например, 1-4, то в регистры портов reg1-2, reg2-2, reg3-2 и пр. ничего не пишется (см. пример выше).

Надеюсь понятно изложил smile.gif Код, само собой не идеален, но мне скорее нужна идея реализации, алгоритм.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SSerge
сообщение Jun 28 2010, 12:40
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Так, если я правильно понял:
У Вас есть 32-разрядное число (portmask), в теле if-а нужно 16 младших бит записать в один регистр, а ещё 9 - в другой.
Первую часть этой задачи Вы выполнили, а вторую нет.

val = portmask & 0x0000ffff; //тут должен быть warning по поводу преобразования long в uint16_t
writeReg(unit, addr, val); // write to regx-1
writeReg(unit, addr+сколько_надо, (uint16_t)(portmask >>16)); // write to regx-2


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
romez777
сообщение Jun 29 2010, 01:20
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую.
спасибо, все действительно очевидно, а то я заблудился в трех соснах smile.gif
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 22:31
Рейтинг@Mail.ru


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