Обсуждаем контроллеры компании Atmel.
Ответить

Ошибки FreeModBus Atmega16 AtmelStudio 6.2

Вт авг 22, 2017 11:03:50

В связи с необходимость осваивания модбаза решил начать уже с готовой либы FreeModBus.
Предварительно почитав теорию по работе протокола. Решился все таки скомпилировать демку FreeModBuss, но не тут то было ) она начала меня осыпать разного рода ошибками. Избавился почти от всех остались вот эти:

Изображение

Код построения:

Код:
------ Построение начато: проект: ProjectFreeModBusSlave, Конфигурация: Debug AVR ------
Построение начато.
Проект "ProjectFreeModBusSlave.cproj" (целевые объекты по умолчанию):
Построение с инструментами версии "2.0".
Целевой объект "PreBuildEvent" пропущен из-за невыполненного условия; выражение ('$(PreBuildEvent)'!='') равно (''!='').
Целевой объект "CoreBuild" в файле "C:\Program Files\Atmel\Atmel Studio 6.2\Vs\Compiler.targets" из проекта "C:\_ATmel\ModBUS\ProjectFreeModBusSlave\ProjectFreeModBusSlave\ProjectFreeModBusSlave.cproj" (целевой объект "Build" зависит от него):
   Задача "RunCompilerTask"
      Shell Utils Path C:\Program Files\Atmel\Atmel Studio 6.2\shellUtils
      C:\Program Files\Atmel\Atmel Studio 6.2\shellUtils\make.exe all
      Building file: .././ProjectFreeModBusSlave.c
      Invoking: AVR/GNU C Compiler : 4.8.1
      "C:\Program Files\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe"  -x c -funsigned-char -funsigned-bitfields -DDEBUG  -I"../../modbus/include" -I"../../modbus/rtu" -I"../port" -I"../../modbus/functions"  -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=atmega16 -c -std=gnu99 -MD -MP -MF "ProjectFreeModBusSlave.d" -MT"ProjectFreeModBusSlave.d" -MT"ProjectFreeModBusSlave.o"   -o "ProjectFreeModBusSlave.o" ".././ProjectFreeModBusSlave.c"
      .././ProjectFreeModBusSlave.c: In function 'main':
C:\_ATmel\ModBUS\ProjectFreeModBusSlave\ProjectFreeModBusSlave\ProjectFreeModBusSlave.c(43,21): warning: variable 'eStatus' set but not used [-Wunused-but-set-variable]
           eMBErrorCode    eStatus;
                           ^
      Finished building: .././ProjectFreeModBusSlave.c
      Building target: ProjectFreeModBusSlave.elf
      Invoking: AVR/GNU Linker : 4.8.1
      "C:\Program Files\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe" -o ProjectFreeModBusSlave.elf  ProjectFreeModBusSlave.o   -Wl,-Map="ProjectFreeModBusSlave.map" -Wl,--start-group -Wl,-lm  -Wl,--end-group -Wl,--gc-sections -mmcu=atmega16 
      ProjectFreeModBusSlave.o: In function `main':
C:\_ATmel\ModBUS\ProjectFreeModBusSlave\ProjectFreeModBusSlave\Debug/.././ProjectFreeModBusSlave.c(45,1): error: undefined reference to `eMBInit'
C:\_ATmel\ModBUS\ProjectFreeModBusSlave\ProjectFreeModBusSlave\Debug/.././ProjectFreeModBusSlave.c(47,1): error: undefined reference to `eMBSetSlaveID'
C:\_ATmel\ModBUS\ProjectFreeModBusSlave\ProjectFreeModBusSlave\Debug/.././ProjectFreeModBusSlave.c(51,1): error: undefined reference to `eMBEnable'
C:\_ATmel\ModBUS\ProjectFreeModBusSlave\ProjectFreeModBusSlave\Debug/.././ProjectFreeModBusSlave.c(55,1): error: undefined reference to `eMBPoll'
collect2.exe(0,0): error: ld returned 1 exit status
      make: *** [ProjectFreeModBusSlave.elf] Error 1
      Выход из команды с кодом "2".
   Выполнение задачи "RunCompilerTask" завершено с ошибкой.
Построение целевого объекта "CoreBuild" в проекте "ProjectFreeModBusSlave.cproj" завершено с ошибкой.
Построение проекта "ProjectFreeModBusSlave.cproj" завершено с ошибкой.

СБОЙ построения.
========== Построение: успешно и без изменений: 0, с ошибками: 1, пропущено: 0 ==========

Инклуды все подключены, и про линкованы.
Изображение
Небольшой анализ гуугла дал результат что такие ошибки встречаются у людей при компиляции на AtmelStudio, при переходе на WinAvr.

Может кто подскажет в какую сторону копать ?

НА всякий пожарный код под спойлером:
Спойлер
Код:
/*
 * FreeModbus Libary: AVR Demo Application
 * Copyright (C) 2006 Christian Walter <wolti@sil.at>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * File: $Id: demo.c,v 1.7 2006/06/15 15:38:02 wolti Exp $
 */

/* ---------- AVR includes ----------*/
#include "avr/io.h"
#include "avr/interrupt.h"

/* ---------- Modbus includes ----------*/
#include "mb.h"
#include "mbport.h"

/* ---------- Defines ----------*/
#define REG_INPUT_START 1000
#define REG_INPUT_NREGS 4

/* ---------- Static variables ----------*/
static USHORT   usRegInputStart = REG_INPUT_START;
static USHORT   usRegInputBuf[REG_INPUT_NREGS];

/* ---------- Start implementation ----------*/
int
main( void )
{
    const UCHAR     ucSlaveID[] = { 0xAA, 0xBB, 0xCC };
    eMBErrorCode    eStatus;

    eStatus = eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_EVEN );

    eStatus = eMBSetSlaveID( 0x34, TRUE, ucSlaveID, 3 );
    sei(  );

    /* Enable the Modbus Protocol Stack. */
    eStatus = eMBEnable(  );

    for( ;; )
    {
        ( void )eMBPoll(  );

        /* Here we simply count the number of poll cycles. */
        usRegInputBuf[0]++;
    }
}

eMBErrorCode
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
{
    eMBErrorCode    eStatus = MB_ENOERR;
    int             iRegIndex;

    if( ( usAddress >= REG_INPUT_START )
        && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
    {
        iRegIndex = ( int )( usAddress - usRegInputStart );
        while( usNRegs > 0 )
        {
            *pucRegBuffer++ =
                ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );
            *pucRegBuffer++ =
                ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );
            iRegIndex++;
            usNRegs--;
        }
    }
    else
    {
        eStatus = MB_ENOREG;
    }

    return eStatus;
}

eMBErrorCode
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,
                 eMBRegisterMode eMode )
{
    return MB_ENOREG;
}


eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,
               eMBRegisterMode eMode )
{
    return MB_ENOREG;
}

eMBErrorCode
eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
{
    return MB_ENOREG;
}

Вложения
2017.08.22 15-44-33.jpg
(90.69 KiB) Скачиваний: 1013
2017.08.22 15-43-42.jpg
(103.94 KiB) Скачиваний: 1342

Re: Ошибки FreeModBus Atmega16 AtmelStudio 6.2

Ср авг 23, 2017 11:23:34

Попалась еще одна интересная либа для модбаза https://github.com/JhonControl/Arduino- ... Modbus-RTU. Но уходить на Ардуину пока не хочется, если конечно только реализовать мастер на ней.

А пока под слейв буду дальше ковырять FreeModBus.

Re: Ошибки FreeModBus Atmega16 AtmelStudio 6.2

Чт авг 24, 2017 11:12:05

Необходимо добавить в проект файлы с функциями eMbInit , eMBPoll

Re: Ошибки FreeModBus Atmega16 AtmelStudio 6.2

Пт авг 25, 2017 03:38:03

Как я выяснил они находятся в ".с" файлах . но #include .c использовать некорректно.
Может подскажите как правильно добавить компилятору(AS6.2) эти файлы.

Re: Ошибки FreeModBus Atmega16 AtmelStudio 6.2

Пт авг 25, 2017 08:06:58

В свойствах проекта добавляете сишные файлы - *.c. "include" только заголовочные файлы - *.h.

Re: Ошибки FreeModBus Atmega16 AtmelStudio 6.2

Пт авг 25, 2017 11:43:09

Ну вот компиляция почти проходит. Теперь столкнулся ,как я думаю с устаревшими векторами.

Ошибки:
Код:
Ошибка   3   attempt to use poisoned "SIG_USART_RECV"   C:\_ATmel\ModBUS\FreeModBusSlave\FreeModBusSlave\port\portserial.c   146   9   FreeModBusSlave
Ошибка   1   attempt to use poisoned "SIG_USART_DATA"   C:\_ATmel\ModBUS\FreeModBusSlave\FreeModBusSlave\port\portserial.c   141   9   FreeModBusSlave
Предупреждение   4   'SIG_USART_RECV' appears to be a misspelled signal handler [enabled by default]   C:\_ATmel\ModBUS\FreeModBusSlave\FreeModBusSlave\port\portserial.c   146   9   FreeModBusSlave
Предупреждение   2   'SIG_USART_DATA' appears to be a misspelled signal handler [enabled by default]   C:\_ATmel\ModBUS\FreeModBusSlave\FreeModBusSlave\port\portserial.c   141   9   FreeModBusSlave


portserial.c :
Код:
SIGNAL( SIG_USART_DATA )
{
    pxMBFrameCBTransmitterEmpty(  );
}

SIGNAL( SIG_USART_RECV )
{
    pxMBFrameCBByteReceived(  );
}


Добавлено after 56 minutes 55 seconds:
Нашел что эту проблему решали редактированием makefile строчкой.
CFLAGS += -D__AVR_LIBC_DEPRECATED_ENABLE__

Добавлено after 4 minutes 1 second:
Заменил:
SIG_OUTPUT_COMPARE1A -> TIMER1_COMPA_vect
SIG_UART_RECV -> USART_RXC_vect
SIG_UART_DATA -> USART_UDRE_vect

Появились еще пару ошибок.
Код:
Ошибка   2   multiple definition of `usMBCRC16'   C:\_ATmel\ModBUS\FreeModBusSlave\FreeModBusSlave\Debug/../port/mbcrc.c   112   1   FreeModBusSlave
Ошибка   3   ld returned 1 exit status   collect2.exe   0   0   FreeModBusSlave
Предупреждение   1   'usTimerOCRBDelta' defined but not used [-Wunused-variable]   C:\_ATmel\ModBUS\FreeModBusSlave\FreeModBusSlave\port\porttimer.c   41   17   FreeModBusSlave



Добавлено after 36 minutes 29 seconds:
Вроде все ошибки устранены.
 
Файл mbcrc.c использовался в исходном коде библиотеки дважды.
1. FreeModBusSlave \ port \ mbcrc.c
2.FreeModBusSlave \ modbus \ rtu \ mbrtu.c

Исключил FreeModBusSlave \ port \ mbcrc.c.
 
/ *
Построение целевого объекта "Build" в проекте "FreeModBusSlave.cproj" завершено.
Построение проекта "FreeModBusSlave.cproj" завершено.

Построение успешно завершено.
========== Построение: успешно и без изменений: 1, с ошибками: 0, пропущено: 0 ==========
* /

Завтра закину код в камушек и начну отладку )
Ответить