Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ошибка li006
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
MiDV
Здравствуйте.
Столкнулся с проблемой: ругается линкер.
Ругань его состоит вот в чем:
********************************************************************************
******************************
Building configuration: Prog - Bin
Updating build tree...

236 file(s) deleted.
Updating build tree...

Linking
Error[Li006]: duplicate definitions for "LWIP_TASK_STK"; in "D:\Project\Bin\Obj\auth.o", and "D:\Project\Bin\Obj\dhcp.o"
Error[Li006]: duplicate definitions for "null_timeouts"; in "D:\Project\Bin\Obj\auth.o", and "D:\Project\Bin\Obj\dhcp.o"

.
.
.

Error[Li006]: duplicate definitions for "pvNullPointer"; in "D:\Project\Bin\Obj\auth.o", and "D:\Project\Bin\Obj\dhcp.o"
Error while running Linker

Total number of errors: 100
Total number of warnings: 58
********************************************************************************
********************************************
Подскажите, пожалуйста, что бы это значило?
Палыч
Скорее всего, в модулях auth и dhcp перечислены одни и те же глобальные переменные, а extern ни в одном из них не стоит...
dxp
Цитата(MiDV @ Aug 9 2011, 17:15) *
Error[Li006]: duplicate definitions for "LWIP_TASK_STK"; in "D:\Project\Bin\Obj\auth.o", and "D:\Project\Bin\Obj\dhcp.o"
Error[Li006]: duplicate definitions for "null_timeouts"; in "D:\Project\Bin\Obj\auth.o", and "D:\Project\Bin\Obj\dhcp.o"
...
Подскажите, пожалуйста, что бы это значило?

А как ещё можно понять написанное? Ведь ясно же сказано, что объявление продублировано в разных файлах, поэтому линкер не знает, какое ему взять, это ошибка. Смотрите, как эти объявления сделаны в указанных файлах. Хинт: смотрите заголовки - возможно, это объявление сделано в заголовочном файле, который включается в эти.
MiDV
Извините, вскочило из головы, хотя хотел написать...
Все переменные, фигурирующие в данных ошибках, определены только в одном месте, и более нигде.
И все эти переменные определены ТОЛЬКО в одном файле.
И что интересно, при подключении /отключении этого файла в указанном месте, он (линкер) выдает те же ошибки, только файл .о другой.
Палыч
Цитата(MiDV @ Aug 9 2011, 14:42) *
Все переменные, фигурирующие в данных ошибках, определены только в одном месте, и более нигде. И все эти переменные определены ТОЛЬКО в одном файле.
Что это за файл? Встречается ли в других файлах #include с этим файлом?
dxp
Цитата(MiDV @ Aug 9 2011, 17:42) *
И что интересно, при подключении /отключении этого файла в указанном месте, он (линкер) выдает те же ошибки, только файл .о другой.

Это и указывает, что объявление это сделано в заголовочном файле - оно, таким образом, неявно описано во всех исходных файлах, которые #include этот заголовочный файл. А линкер выдаёт всего два файла, потому что для ошибки достаточно уже этого. Уберёте один из них - он предъявит следующий.

Ищите в заголовочном файле. Там должны быть только определения и объявления с квалификатором extern. Остальные объявления должны быть в исходных файлах.
MiDV
Спасибо за участие.
Да, действительно, во всех файлах, где ошибка, присутствует include этого единственного.
MiDV
Еще один вопрос.
линкер опять ругается, но только ошибка у него li005:
Building configuration: Prog - Bin
Updating build tree...
.
.
.
Linking
Error[Li005]: no definition for "sys_arch_protect" [referenced from D:\Project\Bin\Obj\pbuf.o]
Error[Li005]: no definition for "sys_arch_unprotect" [referenced from D:\Project\Bin\Obj\pbuf.o]
Error[Li005]: no definition for "sys_arch_sem_wait" [referenced from D:\Project\ Bin\Obj\mem.o]
Error[Li005]: no definition for "sys_sem_signal" [referenced from D:\Project\Bin\Obj\mem.o]
Error while running Linker

Total number of errors: 4
Total number of warnings: 25



Понимаю, что они не объявлены, но как это сделать? При попытке что-то добавить в .h файлы возникает много ругани.Подскажите, из-за чего возникают данные ошибки.Спасибо.
Dog Pawlowa
Цитата(MiDV @ Aug 11 2011, 09:42) *
Понимаю, что они не объявлены, но как это сделать? При попытке что-то добавить в .h файлы возникает много ругани.

Вы вообще про волшебное слово extern слышали?
MiDV
кое-что слышал.
extern - спецификатор хранения.
и я пробовал в pbuf.h sys_arch_protect объявить как extern.
линкер выдал ту же ошибку.
чтобы было понятнее:
я прикручиваю стек LwIP к ucos.
инициализация стека проходит без проблем
а когда инициализирую ppp - вот такая петрушка получается.
и по поводу extern: может я не там объявляю?
Палыч
Цитата(MiDV @ Aug 11 2011, 11:27) *
и я пробовал в pbuf.h sys_arch_protect объявить как extern.
линкер выдал ту же ошибку.
Вероятно, четыре идентификатора, перечисленные в сообщениях об ошибке, нигде не объявлены или везде объявлены со спецификатором extern. Если - последнее, то в одном месте этот спецификатор следует убрать (но, не в файле, который подключен к нескольким другим через include), или вставить в нужное место объявление (без extern).
MiDV
нет. все эти переменные объявлены нормально.
как только я добавляю extern - идут ошибки компилятора, что тип переменной неопределен. если явно задаешь тип - typedef - выдает предупреждение, что данный тип уже объявлен, а линкер все равно указывает на эту же ошибку

Может кто посоветует, где можно найти описание ошибок линкера (юзаю IAR5). Буду премного благодарен. Интересует - чего он вообще хочет, потому что, казалось бы, совсем малюпасенькие действия приводят к непредсказуемой реакции.
Палыч
Вам линкер говорит
Цитата
Error[Li005]: no definition...
, а Вы:
Цитата
переменные объявлены нормально
Всё-таки - объявлены не нормально, раз выдаёт сообщение об ошибке!
MiDV
sys_prot_t sys_arch_protect(void);
а перед этим:
typedef unsigned long __istate_t;
typedef __istate_t sys_prot_t;
Палыч
Цитата(MiDV @ Aug 11 2011, 12:42) *
Интересует - чего он вообще хочет
В сообщении об ошибке ведь всё написано... Трудности с переводом с английского?
MiDV
А раз выдает сообщение - то что-то на так. А чтобы разобраться - надо почитать.
Просто стек уже в готовом виде, компилится без ошибок, а как начинаешь инициализировать - тут и возникают непонятки...
Палыч
Цитата(MiDV @ Aug 11 2011, 12:51) *
sys_prot_t sys_arch_protect(void);
а перед этим:
typedef unsigned long __istate_t;
typedef __istate_t sys_prot_t;

Так все эти "sys_..." - функции? Наверное, файл с этими функциями не включен в проект, или Вы их забыли написать... rolleyes.gif
MiDV
не. с англицким все путем. просто как достучаться до этого файла, на который ссылка?
Палыч
Цитата(MiDV @ Aug 11 2011, 12:56) *
А чтобы разобраться - надо почитать.
Так сообщение об ошибке и читайте: "в модуле pbuf есть обращение к sys_arch_protect, однако самого sys_arch_protect Вы не определили".
MiDV
sys_prot_t sys_arch_protect(void)
{
sys_prot_t Ret = __get_interrupt_state();
__disable_interrupt();
return(Ret);
}
это определение из файла aaa.c

sys_prot_t sys_arch_protect(void); - это из файла aaa.h
#include aaa.h - это из файла bbb.c, в котором я подключаю функцию инициализации. А линкер ругается на файл, который я вообще не трогаю.
Я знаю, что дело не в бобине, но не хватает знания, где мой про..б?
Палыч
Файл aaa.c в проект включен?
MiDV
да. включен.
он присутствует в списке билдера.

Причем, если поискать по проекту sys_arch_protect - то он фигурирует только в двух файлах - aaa.c и aaa.h
Ни о каком файле, на который ссылается линкер и речи не идет
Палыч
Цитата(MiDV @ Aug 11 2011, 13:20) *
Причем, если поискать по проекту sys_arch_protect - то он фигурирует только в двух файлах - aaa.c и aaa.h
При поиске укажите "Project files and all include files"
MiDV
эта опция у меня и стоит.
но все равно...
Палыч
Попробуйте проделать для Вашего проекта "Rebuild All"
MiDV
Наверное, нашел в чем дело:
в aaa.c есть строчка #define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect()
а в том, на который ругается линкер, есть SYS_ARCH_DECL_PROTECT(old_level);
но опять, же aaa.h подключен.
Палыч
Цитата(MiDV @ Aug 11 2011, 14:06) *
но опять, же aaa.h подключен.
Должен быть включен в проект не aaa.h, а файл aaa.c
Проверьте в проекте опции этого файла (не установлена ли галка "Exclude from build"), сравните с опциями других файлов.
MiDV
Я уже не знаю как бороться...
Подскажите, кто может.
Есть проект.
Он компилится нормально и нормально работает в девайсе.
Добавляю в файле bbb.c функцию aaa(); которая прописана в файле aaa.c и aaa.h
Добавляю в файл bbb.с #include aaa.h
идет ошибка линкера li005:Error[Li005]: no definition for "aaa" [referenced from D:\Project\Bin\Obj\bbb.o]
Дописываю в aaa.h строку "#define aaa()" и все становится нормально.
Почему?
Откуда ноги растут???
zltigo
QUOTE (MiDV @ Aug 12 2011, 11:26) *
Почему?

Потому, что Вы не ведаете, что творите и не видите, что пишите sad.gif. Посему все Ваши слова описывающие ситуацию просто дезинформация. Если выложите проект, то исправить "проблему" видя то, что Вы РЕАЛЬНО написали, секундное дело.
MiDV
Или еще
такая же ситуация, только функция определена в хидере так:
#ifndef aaa
u32_t aaa(void);
#endif
А тут уж дописывай что хошь - не помогает...
Как побороть?

не вопрос.
Что именно Вам надо?
Палыч
Цитата(MiDV @ Aug 12 2011, 12:26) *
Дописываю в aaa.h строку "#define aaa()" и все становится нормально.
Почему?
Откуда ноги растут???
Вероятно, потому, что файл aaa.c не включен в проект...
Строка "#define aaa()" в файле aaa.h предписывает препроцессору заменять обращения к функции aaa() на "пусто". Т.е. фактически исключает вызов функции aaa() из всех модулей, в которых файл aaa.h подключен через include.

Заархивируйте Ваш проект каким-нибудь распространненным архиватором (zip, например). Выложите (прикрепите к сообщению) этот архив, чтобы желающие Вам помочь смогли сами разобраться с Вашими ошибками, а не судить о них по Вашим сообщениям.
MiDV
Прикрепил упакованный проект.
в файле LwIP.c идет вызов pppInit();
Линкер выдает 3 ошибки li005.
zltigo
Я конечно дико извиняюсь, но Вам надо начинать с помигать светодиодом и чтения букварей sad.gif. Операционки и Стеки много позже....

1. Если по честному то у Вас в так называемом "проекте" не 3 ошибки а 224 и 30 предупреждений.
Total number of errors: 224
Из-за конфликтов в дважды включенных хидерах идущих в комплекте с компилятором и зачем-то еще в комплекте с операционкой. Причем с операционкой старые в комплекте.

Total number of warnings: 30
Нет прототипов для некоторых библиотечных функций и лишние переменные

2. Те три ошибки, которые Вас особо взволновали, это совершенно законные ошибки, поскольку вот этих трех функций

Error[Li005]: no definition for "sys_jiffies" [referenced from D:\WORK_ARM\STM32_F107_lwIP_uCOS\IAR\F107_uCOS\Debug\Obj\ppp.o]
Error[Li005]: no definition for "sio_write" [referenced from D:\WORK_ARM\STM32_F107_lwIP_uCOS\IAR\F107_uCOS\Debug\Obj\ppp.o]
Error[Li005]: no definition for "sio_read_abort" [referenced from D:\WORK_ARM\STM32_F107_lwIP_uCOS\IAR\F107_uCOS\Debug\Obj\ppp.o]

в присланном Вами проекте нет. СОВСЕМ НЕТ. Не написали Вы их. Вот так.
MiDV
Не знаю, где Вы нашли столько ошибок и предупреждений.
Я распаковал архив и откомпилил его.
Вот результат:
Building configuration: STM32_F107_uCOS_5.30 - Debug
Updating build tree...

296 file(s) deleted.
Updating build tree...
netdb.c
os_tmr.c
igmp.c
netifapi.c
err.c
stm32f10x_i2c.c
udpecho.c
os_task.c
stm32f10x_flash.c
os_dbg.c
bsp_int.c
tcp_in.c
stm32f10x_spi.c
lib_str.c
inet.c
lib_mem.c
icmp.c
tcpserver2.c
os_flag.c
lwIP.c
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\port\lwIP.c 142
tcpserver.c
Warning[Pe177]: variable "send_data" was declared but never referenced D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\IAR\F107_uCOS\netapp\tcpserver.c 48
misc.c
api_lib.c
netbuf.c
tcpmultiserver.c
os_core.c
system_stm32f10x.c
udpserver.c
os_mutex.c
magic.c
chap.c
fsm.c
Warning[Pe223]: function "strlen" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\fsm.c 291
Warning[Pe223]: function "memcpy" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\fsm.c 345
Warning[Pe550]: variable "code" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\fsm.c 834
Warning[Pe550]: variable "id" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\fsm.c 834
dhcp.c
slipif.c
loopif.c
tcp_out.c
Warning[Pe550]: variable "tcphdr" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\core\tcp_out.c 458
Warning[Pe550]: variable "tcphdr" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\core\tcp_out.c 871
Warning[Pe550]: variable "tcphdr" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\core\tcp_out.c 925
ppp.c
Warning[Pe177]: variable "pc" was declared but never referenced D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\ppp.c 309
Warning[Pe177]: variable "pc" was declared but never referenced D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\ppp.c 328
Warning[Pe550]: variable "c" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\ppp.c 731
pap.c
Warning[Pe223]: function "strlen" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\pap.c 127
Warning[Pe223]: function "memset" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\pap.c 442
Warning[Pe550]: variable "msg" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\pap.c 467
Warning[Pe550]: variable "msg" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\pap.c 506
Warning[Pe223]: function "memcpy" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\pap.c 560
Warning[Pe223]: function "memcpy" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\pap.c 592
app.c
stats.c
stm32f10x_gpio.c
sample_http.c
md5.c
ip_frag.c
udpclient.c
sys_arch.c
Warning[Pe550]: variable "ubErr" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\port\sys_arch.c 119
Warning[Pe550]: variable "ubErr" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\port\sys_arch.c 134
Warning[Pe550]: variable "ucErr" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\port\sys_arch.c 277
core_cm3.c
os_q.c
sample_TTCP.c
Warning[Pe550]: variable "data" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\IAR\F107_uCOS\netapp\sample_TTCP.c 115
auth.c
Warning[Pe223]: function "memcpy" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\auth.c 365
Warning[Pe223]: function "memset" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\auth.c 389
Warning[Pe223]: function "memset" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\auth.c 420
Warning[Pe223]: function "strcpy" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\auth.c 881
Warning[Pe223]: function "strcpy" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\auth.c 884
memp.c
os_mem.c
inet_chksum.c
dns.c
ppp_oe.c
chpms.c
randm.c
Warning[Pe223]: function "srand" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\randm.c 205
Warning[Pe223]: function "rand" declared implicitly D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\randm.c 243
raw.c
ethernetif.c
etharp.c
ip_addr.c
app_vect_v5.c
mem.c
cpu_c.c
udp.c
vj.c
api_msg.c
autoip.c
bsp.c
bsp_periph.c
cpu_a.asm
init.c
ip.c
ipcp.c
lcp.c
lib_mem_a.asm
netdatapack.c
Warning[Pa093]: implicit conversion from floating point to integer D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\IAR\F107_uCOS\netapp\netdatapack.c 71
netif.c
netio.c
os_cpu_a.asm
os_cpu_c.c
os_mbox.c
os_sem.c
os_time.c
pbuf.c
sockets.c
stm3210c_eval_lcd.c
stm32_eth.c
stm32f10x_adc.c
stm32f10x_can.c
stm32f10x_dbgmcu.c
stm32f10x_exti.c
stm32f10x_rcc.c
stm32f10x_tim.c
stm32f10x_usart.c
sys.c
tcp.c
tcpclient.c
tcpecho.c
Warning[Pe550]: variable "err" was set but never used D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\IAR\F107_uCOS\netapp\tcpecho.c 47
tcpip.c
Linking
Error[Li005]: no definition for "sys_jiffies" [referenced from D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\IAR\F107_uCOS\Debug\
Obj\ppp.o]
Error[Li005]: no definition for "sio_write" [referenced from D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\IAR\F107_uCOS\Debug\Obj\
ppp.o]
Error[Li005]: no definition for "sio_read_abort" [referenced from D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\IAR\F107_uCOS\
Debug\Obj\ppp.o]
Error while running Linker

Total number of errors: 3
Total number of warnings: 31
/*===========================================================================*/

А вот что по поиску предмета первой ошибки:
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\include\lwip\sys.h 121 #ifndef sys_jiffies
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\include\lwip\sys.h 122 u32_t sys_jiffies(void); /* since power up. */
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\ppp.c 803 pc->lastXMit = sys_jiffies();
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\ppp.c 902 if ((sys_jiffies() - pc->lastXMit) >= PPP_MAXIDLEFLAG) {
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\ppp.c 906 pc->lastXMit = sys_jiffies();
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\ppp.c 1057 pc->lastXMit = sys_jiffies();
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\ppp.c 1104 if ((sys_jiffies() - pc->lastXMit) >= PPP_MAXIDLEFLAG) {
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\ppp.c 1107 pc->lastXMit = sys_jiffies();
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\randm.c 201 avRandomSeed += sys_jiffies(); /* XXX */
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\randm.c 226 avRandomSeed += (sys_jiffies() - last_jiffies); /* XXX */
D:\Project_MiDV\TCP_IP stack\Project\STM32_F107_lwIP_uCOS\lwIP\src\netif\ppp\randm.c 228 last_jiffies = sys_jiffies();
----------
Found 11 instances. Searched in 251 files.

Во второй строке сверху она определяется.

Хотя...
Это стандартный tcpip стек LwIP v.1.3.0
И я пытаюсь использовать в нем ppp.
zltigo
QUOTE (MiDV @ Aug 12 2011, 14:13) *
Во второй строке сверху она определяется.

Особо тяжелый случай sad.gif. Букварь читать рано. Надо слушать сказки про Ходжу Насреддина. У него есть популярное объяснение разницы между словом Халва (объявление функции)и собственно самой Халвой (функцией). Написав слово u23 halva(void); Вы не получили ничего, кроме слова Халва. Самой Халвы нет и линкеру ее взять негде.
MiDV
Да, действительно, эти функции не прописаны.
мол, кому надо - напишете
Спасибо всем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.