Severity code description project file line error undefined reference to

I've got very annoying error when trying to build my app. Here is complete error stack Severity Code Description Project File Line Error linker command failed with exit code 1 (use...

I’ve got very annoying error when trying to build my app.

Here is complete error stack

Severity    Code    Description Project File    Line
Error       linker command failed with exit code 1 (use -v to see invocation)   PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityclang.exe  1
Error       undefined reference to 'glGetAttribLocation'    PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   70
Error       undefined reference to 'glCreateProgram'    PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   87
Error       undefined reference to 'glAttachShader' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   91
Error       undefined reference to 'glAttachShader' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   92
Error       undefined reference to 'glLinkProgram'  PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   93
Error       undefined reference to 'glGetProgramiv' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   96
Error       undefined reference to 'glDeleteProgram'    PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   100
Error       undefined reference to 'glCreateShader' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   111
Error       undefined reference to 'glShaderSource' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   115
Error       undefined reference to 'glCompileShader'    PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   116
Error       undefined reference to 'glGetShaderiv'  PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   119
Error       undefined reference to 'glGetShaderiv'  PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   124
Error       undefined reference to 'glDeleteShader' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   128
Error       undefined reference to 'glUseProgram'   PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   172
Error       undefined reference to 'glVertexAttribPointer'  PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   174
Error       undefined reference to 'glEnableVertexAttribArray'  PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   175

Well, it seems to be related to OpenGL calls, but I can’t understand how exactly.

I’ve already included

#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <EGL/egl.h>
#include <GLES/gl.h>

But still no luck.

Any suggestions about what am I doing wrong?

Mogsdad's user avatar

Mogsdad

44k21 gold badges151 silver badges272 bronze badges

asked Nov 30, 2015 at 16:05

user1496491's user avatar

Okay, never mind, guys, I’ve just figured it out all by myself.

This problem appears because I’m trying to use GLES 2.0 Functions, instead of GLES 1.0 (which is set by default when you create new NativeActivity application). So, basically all you need to do is right-click on your project and go Properties -> Linker -> Input -> Library Dependencies and change GLESv1_CM to GLESv2.

Mogsdad's user avatar

Mogsdad

44k21 gold badges151 silver badges272 bronze badges

answered Dec 1, 2015 at 9:14

user1496491's user avatar

user1496491user1496491

4132 gold badges10 silver badges23 bronze badges

I’ve got very annoying error when trying to build my app.

Here is complete error stack

Severity    Code    Description Project File    Line
Error       linker command failed with exit code 1 (use -v to see invocation)   PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityclang.exe  1
Error       undefined reference to 'glGetAttribLocation'    PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   70
Error       undefined reference to 'glCreateProgram'    PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   87
Error       undefined reference to 'glAttachShader' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   91
Error       undefined reference to 'glAttachShader' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   92
Error       undefined reference to 'glLinkProgram'  PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   93
Error       undefined reference to 'glGetProgramiv' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   96
Error       undefined reference to 'glDeleteProgram'    PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   100
Error       undefined reference to 'glCreateShader' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   111
Error       undefined reference to 'glShaderSource' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   115
Error       undefined reference to 'glCompileShader'    PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   116
Error       undefined reference to 'glGetShaderiv'  PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   119
Error       undefined reference to 'glGetShaderiv'  PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   124
Error       undefined reference to 'glDeleteShader' PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   128
Error       undefined reference to 'glUseProgram'   PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   172
Error       undefined reference to 'glVertexAttribPointer'  PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   174
Error       undefined reference to 'glEnableVertexAttribArray'  PewPew.NativeActivity   c:workspacePewPewPewPewPewPew.NativeActivityRenderer.cpp   175

Well, it seems to be related to OpenGL calls, but I can’t understand how exactly.

I’ve already included

#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <EGL/egl.h>
#include <GLES/gl.h>

But still no luck.

Any suggestions about what am I doing wrong?

Mogsdad's user avatar

Mogsdad

44k21 gold badges151 silver badges272 bronze badges

asked Nov 30, 2015 at 16:05

user1496491's user avatar

Okay, never mind, guys, I’ve just figured it out all by myself.

This problem appears because I’m trying to use GLES 2.0 Functions, instead of GLES 1.0 (which is set by default when you create new NativeActivity application). So, basically all you need to do is right-click on your project and go Properties -> Linker -> Input -> Library Dependencies and change GLESv1_CM to GLESv2.

Mogsdad's user avatar

Mogsdad

44k21 gold badges151 silver badges272 bronze badges

answered Dec 1, 2015 at 9:14

user1496491's user avatar

user1496491user1496491

4132 gold badges10 silver badges23 bronze badges

Dassis

0 / 0 / 1

Регистрация: 11.09.2015

Сообщений: 83

1

вываливается море ошибок при компиляции модуля

12.10.2016, 01:30. Показов 1119. Ответов 7

Метки нет (Все метки)


Работаю на VS C++ 2015 и столкнулся в проблемой, а именно при создании модулей выводит кучу ошибок

Список ошибок

Severity Code Description Project File Line Suppression State
Error C2143 syntax error: missing ‘;’ before ‘<‘ Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 10
Error C2143 syntax error: missing ‘;’ before ‘<‘ Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 10
Error C2143 syntax error: missing ‘,’ before ‘<‘ Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 12
Error C2143 syntax error: missing ‘,’ before ‘<‘ Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 12
Error C4430 missing type specifier — int assumed. Note: C++ does not support default-int Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 10
Error C4430 missing type specifier — int assumed. Note: C++ does not support default-int Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 12
Error C4430 missing type specifier — int assumed. Note: C++ does not support default-int Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 10
Error C4430 missing type specifier — int assumed. Note: C++ does not support default-int Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 12
Error C2039 ‘forward_list’: is not a member of ‘std’ Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 10
Error C2039 ‘forward_list’: is not a member of ‘std’ Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 12
Error C2039 ‘forward_list’: is not a member of ‘std’ Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 10
Error C2039 ‘forward_list’: is not a member of ‘std’ Lab1_1 c:usersgdk17desktopунивероопlab1_1lab1_1it 1.h 12

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef IT1_H
#define IT1_H
 
std::vector<int> readVec(std::vector<int> &vct);
 
template <class T>
void printVec(const std::vector<T> &vct);
 
std::forward_list<int> enterForw(std::forward_list<int> &fl, std::vector<int> &vct);
 
void printForward(const std::forward_list<int> fl);
 
#endif

Копался с windows.h не спасает, но в командной строке windows все работает, хотелось бы разобраться с VS, подскажите в чем проблема может быть?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



3433 / 2812 / 1249

Регистрация: 29.01.2016

Сообщений: 9,426

12.10.2016, 06:07

2

А инклуды где?



0



Dassis

0 / 0 / 1

Регистрация: 11.09.2015

Сообщений: 83

12.10.2016, 10:12

 [ТС]

3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "Windows.h"
#include <forward_list>
#include <iostream>
#include <vector>
#include <iterator>
#include "it1.h"
 
 
std::vector<int> readVec(std::vector<int> &vct)
{
    int tmp = 0;
    while (std::cin >> tmp)
    {
        vct.push_back(tmp);
    }
    return vct;
}
 
template <class T>
void printVec(const std::vector<T> &vct)
{
    for (int i = 0; i != vct.size(); i++)
    {
        std::cout << vct[i] << " ";
    }
    std::cout << std::endl;
}
 
std::forward_list<int> enterForw(std::forward_list<int> &fl, std::vector<int> &vct)
{
    for (int i = 0; i != vct.size(); i++)
    {
        fl.push_front(vct[i]);
    }
    return fl;
}
 
void printForward(const std::forward_list<int> fl)
{
    std::copy(fl.begin(), fl.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}



0



3433 / 2812 / 1249

Регистрация: 29.01.2016

Сообщений: 9,426

12.10.2016, 10:27

4

Перенеси инклуды в t1.h.

Добавлено через 11 минут
И реализацию шаблона — туда же.



0



0 / 0 / 1

Регистрация: 11.09.2015

Сообщений: 83

12.10.2016, 10:43

 [ТС]

5

nd2, большое спасибо, все заработало, выходит что шаблоны надо писать в файлах .h, но почему так?



0



3433 / 2812 / 1249

Регистрация: 29.01.2016

Сообщений: 9,426

12.10.2016, 10:55

6

Цитата
Сообщение от Dassis
Посмотреть сообщение

но почему так?

Там, где компилятор будет делать инстанс шаблона, ему нужно видеть реализацию шаблона, а не только прототип. Множественных определений, как было бы с реализациями функций, при подключении такого .h файла, тут не будет, потому что это только шаблоны (образцы для создания реализаций).



0



0 / 0 / 1

Регистрация: 11.09.2015

Сообщений: 83

12.10.2016, 11:18

 [ТС]

8

Croessmah, nd2, спасибо



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

12.10.2016, 11:18

8

Viewing 8 posts — 1 through 8 (of 8 total)

  • Author

    Posts

  • January 10, 2017 at 22:57

    #10023

    I have an STM32F072RB project using the toolchain ARM in C:SysGCCarm-eabi.

    When I try to build my project and it includes an integer to string conversion using any function in the printf() family (sprintf(), vsnprintf(), etc.), I get the following linker error.

    Severity Code Description Project File Line Suppression State
    Error undefined reference to `_sbrk’ MyProject q:gnunewlib-nanonewlib-nano-2016q3newliblibcreentsbrkr.c 58
    Error ld returned 1 exit status MyProject C:[path to MyProject]collect2.exe 1

    Why is this happening, and how can I fix it?

    I have the latest VisualGDB packages, as shown below.

    • This topic was modified 6 years, 1 month ago by  bmcdonnell_psi. Reason: add version details

    January 10, 2017 at 23:20

    #10025

    Actually, it’s not just for number conversions. Maybe for every time there’s a format string followed by one or more var args? I’m not totally sure the circumstances.

    January 11, 2017 at 06:00

    #10031

    Hi,

    This error happens because the newlib-nano does not include the default implementations for system calls like _sbrk().

    To fix this, please simply enable the ‘provide default implementations for system calls’ checkbox on the first page of VisualGDB Project Properties.

    April 13, 2017 at 16:37

    #10987

    Hi,

    I am also getting this error. I am currently using a 5.2r9 trial version and I am building for the STM32F746.

    I have read the instruction above but I can not find the ‘provide default implementations for system calls’ checkbox anywhere. I have looked in various places, including: right click on Project, VisualGDB Project Properties.

    I would be very grateful for some help.

    Thanks

    April 13, 2017 at 16:54

    #10988

    Sorry to repost but I should add some more information for you…

    I am using the latest ARM toolchain: 6-2017-q1-update. This is installed to c:SysGCC6_2017-q1-update.

    The VisualGDB package manager does not display the GCC or GDB versions for this, but it does compile the project. It fails at the linking stage (sbrk).

    Thanks

    April 13, 2017 at 17:25

    #10989

    3rd post in a row 🙂

    Typical – I had been looking at this for a few hours and as soon as I post a question … I find the answer myself!!!

    I was using the latest toolchain that I had downloaded from ARM. I am now using the Prebuilt GNU toolchain for arm-eabi downloaded from sysprogs and it works.

    Thanks

    April 14, 2017 at 03:12

    #10991

    Hi,

    For a 3rd-party toolchain you would need to manually specify “–specs=nosys.specs” via LDFLAGS to include the necessary libraries. The toolchains shipped by us have this flag conveniently mapped to a checkbox in the settings, but 3rd-party toolchains would require specifying it manually.

    April 18, 2017 at 12:19

    #11014

    Hi,

    Thanks for your answer – I am using the toolchains shipped by yourselves now as they work straight away with no issues!

    Thanks

  • Author

    Posts

Viewing 8 posts — 1 through 8 (of 8 total)

You must be logged in to reply to this topic.

@tensorflow/micro

System information

  • Host OS Platform and Distribution (e.g., Linux Ubuntu 16.04): make with Linux Ubuntu 20.04, complied on Atmel Studio on Windows 10, Python 3.7.7
  • TensorFlow installed from (source or binary): downloaded from master
  • Tensorflow version (commit SHA if source): 2.3.0, e544dce
  • Target platform (e.g. Arm Mbed OS, Arduino Nano 33 etc.): Atmel SAMD51 — Atmel Studio

Describe the problem
I have made the projects as described on the tflite for microcontroller webpage specifying TAGS=cmsis-nn to use the optimized backend. I have then moved the files from magic wand project to my project on Atmel Studio, making sure to add all the directories in a correct manner and compiled the project. Compilation is succesfull but I get a bunch of errors when trying to link:

Severity	Code	Description	Project	File	Line
Error		recipe for target 'TFLite_SAMD51.elf' failed	TFLite_SAMD51	DebugMakefile	1314
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitekernelsinternalreferenceconv.h	69
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitekernelsinternalreferenceconv.h	149
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitekernelsinternalreferenceinteger_opsconv.h	72
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitekernelsinternalreferenceinteger_opspooling.h	122
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitekernelsinternalreferencepooling.h	118
Error		undefined reference to `tflite::micro::GetEvalInput(TfLiteContext const*, TfLiteNode const*, int)'	TFLite_SAMD51	tensorflowlitekernelsinternaltypes.h	390
Error		undefined reference to `tflite::micro::GetEvalOutput(TfLiteContext const*, TfLiteNode const*, int)'	TFLite_SAMD51	tensorflowlitekernelsinternaltypes.h	390
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitekernelsinternaltypes.h	390
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitekernelsinternaltypes.h	391
Error		undefined reference to `tflite::micro::GetEvalInput(TfLiteContext const*, TfLiteNode const*, int)'	TFLite_SAMD51	tensorflowlitekernelsinternaltypes.h	391
Error		undefined reference to `tflite::micro::GetEvalOutput(TfLiteContext const*, TfLiteNode const*, int)'	TFLite_SAMD51	tensorflowlitekernelsinternaltypes.h	391
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitekernelsinternaltypes.h	391
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitekernelsinternaltypes.h	392
Error		undefined reference to `tflite::micro::GetEvalInput(TfLiteContext const*, TfLiteNode const*, int)'	TFLite_SAMD51	tensorflowlitemicrokernelsconv.cpp	308
Error		undefined reference to `tflite::micro::GetEvalOutput(TfLiteContext const*, TfLiteNode const*, int)'	TFLite_SAMD51	tensorflowlitemicrokernelsconv.cpp	308
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitemicrokernelsfully_connected.cpp	178
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitemicrokernelsfully_connected.cpp	178
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitemicrokernelsfully_connected.cpp	202
Error		undefined reference to `tflite::micro::GetEvalInput(TfLiteContext const*, TfLiteNode const*, int)'	TFLite_SAMD51	tensorflowlitemicrokernelsfully_connected.cpp	228
Error		undefined reference to `tflite::micro::GetEvalOutput(TfLiteContext const*, TfLiteNode const*, int)'	TFLite_SAMD51	tensorflowlitemicrokernelsfully_connected.cpp	228
Error		undefined reference to `tflite::micro::GetTensorShape(TfLiteEvalTensor const*)'	TFLite_SAMD51	tensorflowlitemicrokernelsfully_connected.cpp	228

I have adapted the magic wand project made without the CMSIS-NN tag and it runs smoothly.
The working non-cmsis can be found here: https://github.com/Sixaxis9/TFLite-SAMD51

Please provide the exact sequence of commands/steps when you ran into the problem
make -f tensorflow/lite/micro/tools/make/Makefile TAGS=cmsis-nn generate_projects
go to tensorflow/lite/micro/tools/make/gen/linux_x86_64/prj/magic_wand/tensorflow_lite/src and copy the tensorflow and third_parties folders into an Atmel studio project
Added ./ to the directory in compiler settings
Used the same main as the non cmsis variant I have been using succesfully until now (derived anyway from the example).

 
 

Before logging an issue, please update to the latest release of Visual Micro from the Downloads Page.

When Logging a Support Issue in the Forum, please ensure you have also:-

  • Enabled vMicro > Compiler > Show Build Properties and Verbose
  • Re-Compile your program with these settings enabled

 

Save the new Output to a Text File and….

  • Click the Reply button and attach as .txt file OR
  • Click here to Email us with the file attached, and a link to your post
Support requests without the output above may be impossible to answer, so please help us to help you
 

Hot Topic (More than 8 Replies) Strange compile errors (Read 3134 times)


Abbott HMG

Junior Member

**
Offline

Posts: 56
Location: Bedford, NY, USA

Joined: May 10th, 2019

Strange compile errors

Oct 17th, 2019 at 9:36pm

Print Post
 

When I compile a large program for a mega 2560, although VS 2019 does not flag any errors, I get the following errors at the end of the compilation:
Severity      Code      Description      Project      File      Line      Suppression State
Error            (.text.startup+0x96e): undefined reference to LogClass::BrokenLines            <artificial>            
Error            (.text.startup+0x8f2): undefined reference to LogClass::ActiveLines            <artificial>            
Error            (.text.startup+0x7f2): undefined reference to LogClass::State            <artificial>            
Error            (.text.startup+0x970): undefined reference to LogClass::BrokenLines            <artificial>            
Error            (.text.startup+0x7f0): undefined reference to LogClass::State            <artificial>            
Error            (.text.startup+0x8f0): undefined reference to LogClass::ActiveLines            <artificial>            
Error            error: ld returned 1 exit status            collect2.exe            
Warning            In function main            C:UsersAbbottAppDataLocalTempccMkFEsR.ltrans0.ltrans.o            

These public Log Class properties are used throughout the project.

Code

Select All

// Log.h

#ifndef _LOG_h
#define _LOG_h

#if defined(ARDUINO) && ARDUINO >= 100
	#include "arduino.h"
#else
	#include "WProgram.h"
#endif

class LogClass
{
public:
	static void Init();
	static String ActiveLines;
	static String BrokenLines;
	static String FileName;
	static String FlowLast;
	static String FlowRate;
	static String FlowTot;
	static int FreeRam;
	static String HeaterTempF;
	static  bool IsRunning;
	static  int JsonLenAct;
		//todo Allocate 256b and allow value to be written
	static String Message;
	static String State;
	static String TempF;
	static String TimeDate;
	static String VacuumPsi;
	static String WebAction;
	static String WebRequest;
};
extern LogClass Log;
#endif 

I’m not sure how to approach finding my issue.
Thanks
Abbott

I’ve attached the  verbose and the logger.cpp which uses the log.h


Please Register or Login to the Forum to see File Attachments

Back to top

IP Logged
 


Tim@Visual Micro

Administrator

*****
Offline

Posts: 11684
Location: United Kingdom

Joined: Apr 10th, 2010

Re: Strange compile errors

Reply #1 — Oct 18th, 2019 at 12:55pm

Print Post
 

Please try clicking «build>clean solution» then build and repost the verbose output if there is still a problem.

Back to top

WWW
 

IP Logged
 


Abbott HMG

Junior Member

**
Offline

Posts: 56
Location: Bedford, NY, USA

Joined: May 10th, 2019

Re: Strange compile errors

Reply #2 — Oct 18th, 2019 at 9:03pm

Print Post
 

Same result.
I did a clean (usually works w/ asp.net & win-forms). When I did the build, a pointer to the various libraries was broken, so those includes were not found. When I add 1 library, the rest of the includes got resolved.
I’ve attached the latest verbose.
Thanks for the fast response.
Abbott


Please Register or Login to the Forum to see File Attachments

Back to top

IP Logged
 


Tim@Visual Micro

Administrator

*****
Offline

Posts: 11684
Location: United Kingdom

Joined: Apr 10th, 2010

Re: Strange compile errors

Reply #3 — Oct 19th, 2019 at 12:56pm

Print Post
 

The «build>clean solution» clears the build cache for the avr core so that would give a fuller compiler output.

I notice one strange thing. You seem to be using a custom core. I suggest you move or delete the «documents/arduino/hardware/arduino» folder if you did not intent to use a custom core.

The build should then use the avr core installed with the arduino ide.

Back to top

WWW
 

IP Logged
 


Abbott HMG

Junior Member

**
Offline

Posts: 56
Location: Bedford, NY, USA

Joined: May 10th, 2019

Re: Strange compile errors

Reply #4 — Oct 20th, 2019 at 8:06pm

Print Post
 

I created a new project and added the h & cpp files and still got compile errors.

Thanks Abbott


Please Register or Login to the Forum to see File Attachments

Back to top

IP Logged
 


Tim@Visual Micro

Administrator

*****
Offline

Posts: 11684
Location: United Kingdom

Joined: Apr 10th, 2010

Re: Strange compile errors

Reply #5 — Oct 20th, 2019 at 8:45pm

Print Post
 

please zip and email a failing example to the email address in the click ehere above. Also add a link to this post.

Thanks

Back to top

WWW
 

IP Logged
 


Abbott HMG

Junior Member

**
Offline

Posts: 56
Location: Bedford, NY, USA

Joined: May 10th, 2019

Re: Strange compile errors

Reply #6 — Oct 21st, 2019 at 4:41pm

Print Post
 

I’ve done that. As a test, I purchased an additional (3 machine) licence for vm to test on a productuin desktip I have. It failed with the same errors…Took me 3 hours to get the additional environment working properly .. uggh.
Abbott

Back to top

IP Logged
 


Tim@Visual Micro

Administrator

*****
Offline

Posts: 11684
Location: United Kingdom

Joined: Apr 10th, 2010

Re: Strange compile errors

Reply #7 — Oct 21st, 2019 at 5:40pm

Print Post
 

Thanks for the project. It fails for me in both Visual Micro and the Arduino IDE with the same error. + see important note below.

Code (C++)

Select All

Enms.cpp:1: In file included from

Enms.h: 40:3: error: redeclaration of 'StartUp
   StartUp
   ^~~~~~~
Enms.h:27: note  previous declaration EnumsClass  State StartUp
   StartUp 

One point of note. Your library folders contain a version number but they are not added to the solution as shared libraries. Therefore both arduino and visual micro will reolve by first hunting for a .h with the same name as a lib folder. If for example, we find SPI.h then we will look for a library that has a folder name of SPI and use that library. Only if we can not find a library by folder name we then look for the .h in other library folders such as in lib folder «SPI-1.x.x»

Therefore by using the versioned library folder names you might cause confusion with where library headers are resolved from.

If you have clashes then you should ensure that you use the NoIDE option which prevents the ArduinoIDELibraries folder from being found and ensure you do not have both an SPI library and an SPI-1.x.x library in myDocumentsArduinoLibraries. You should ensure the tool chain you are using such as AVR does not have an AVRLibraries folder with an SPI folder.

Better still move you versioned libraries to another location and add them as shared project references. Visual Micro looks for shared library projects before performing the «arduino» library discovery logic. Therefore shared libraries always take presence and make it easier to locate the intended library version.

« Last Edit: Oct 21st, 2019 at 5:48pm by Tim@Visual Micro »  

Back to top

WWW
 

IP Logged
 


Abbott HMG

Junior Member

**
Offline

Posts: 56
Location: Bedford, NY, USA

Joined: May 10th, 2019

Re: Strange compile errors

Reply #8 — Oct 23rd, 2019 at 12:24am

Print Post
 

I believe I followed your instructions properly. Still get the errors. The libraries are all part of the project. I’ve attached to updated project library and the Verbose log.
Thanks
Abbott


Please Register or Login to the Forum to see File Attachments

Back to top

IP Logged
 


Tim@Visual Micro

Administrator

*****
Offline

Posts: 11684
Location: United Kingdom

Joined: Apr 10th, 2010

Re: Strange compile errors

Reply #9 — Oct 23rd, 2019 at 2:46pm

Print Post
 

Please confirm it builds in the arduino ide. As I said the project source you provided failed in both arduino and visual micro.

Back to top

WWW
 

IP Logged
 


Abbott HMG

Junior Member

**
Offline

Posts: 56
Location: Bedford, NY, USA

Joined: May 10th, 2019

Re: Strange compile errors

Reply #10 — Oct 23rd, 2019 at 5:09pm

Print Post
 

It does NOT compile properly in the Arduino IDE. I’ve attached the error list


Please Register or Login to the Forum to see File Attachments

Back to top

IP Logged
 


Tim@Visual Micro

Administrator

*****
Offline

Posts: 11684
Location: United Kingdom

Joined: Apr 10th, 2010

Re: Strange compile errors

Reply #11 — Oct 23rd, 2019 at 7:04pm

Print Post
 

The best place for help with your own code is the forum at arduino.cc. That’s where the arduino experts are. In this forum we can only help with Visual Micro issues.

Back to top

WWW
 

IP Logged
 


Abbott HMG

Junior Member

**
Offline

Posts: 56
Location: Bedford, NY, USA

Joined: May 10th, 2019

Re: Strange compile errors

Reply #12 — Oct 24th, 2019 at 8:04pm

Print Post
 

I agree. Sorry for the time wasted.

Back to top

IP Logged
 

Форум РадиоКот • Просмотр темы — Помогите понять, что творит оптимизатор Си AVR

Сообщения без ответов | Активные темы

ПРЯМО СЕЙЧАС:

Автор Сообщение

Не в сети

Заголовок сообщения: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Пт апр 01, 2016 00:21:18 

Потрогал лапой паяльник
Аватар пользователя

Карма: 4

Рейтинг сообщений: 13

Зарегистрирован: Пн апр 01, 2013 15:13:40
Сообщений: 343
Откуда: Москва

Рейтинг сообщения: 3

Здравствуйте. Сразу оговорюсь, что создал новую тему а не написал в «Несколько простых вопросов по Си AVR», т.к. вопрос для меня очень важный и не хочу, чтобы он затерялся в той ветке без ответа.

Дело такое: писал я себе на ассемблере и горя не знал. Ну за исключением того, что это ассемблер и надо всё делать ручками.
Потом у меня был долгий перерыв в программировании. Сейчас опять занялся, но решил писать на Си. Всё равно я не пишу сложных программ и все мои устройства носят скорее вспомогательный характер, нежели целевой продукт производства. Что думаю париться со стеком, регистровыми парами и прочими делами, если можно на Си всё по быстрому писать.

Ну так вот. Делаю простенькое устройство. Первое что решил написать – это часть кода, которая будет управлять трехразрядным семисегментным индикатором, схема которого ОА. Индикатор управляется через 2 последовательно соединенных сдвиговых регистра 74HC595D.
Казалось бы, чего тут проще?
На схеме я убрал всё лишнее, чтобы не загромождать. Да, не обращайте внимания, что я как-то странно назвал линии управления сдвиговым регистром. Схему сделал давно (на ассемблере всё работало без каких-либо проблем. Там я вообще по 1 проводу всеми тремя ногами сдвигового регистра управлял).

Короче говоря, сдвиговые регистры подключены последовательно, то есть биты пройдя первый насквозь, попадают во второй. Выводы управления регистрами запараллелены между собой.
Используется :

линия данных (Data) (состояние с которой считывается в регистр),

линия записи лог состояния с Data (ReadData) и

линия вывода считанного байта на порт регистра (ShowData).

Линии управления (Data, ReadData, ShowData) напрямую подключены к микроконтроллеру ATtiny2313A. На всякий случай оговорюсь, что земли
регистров и контроллера, также как и линия питания – общие. Еще один момент – выводы регистра Q0-Q7, которые подключены к катодам индикатора A-H могут не соответствовать тем кодам, которые лежат в массиве кодов индикатора в программе. Это связано с тем, что как я уже говорил, схема была сделана давно, а сейчас просто доработана и переложена на другую плату.

Теперь идём к программе.
Проект С (не С++), Atmel Studio 7.0. Оптимизатор настроен на –О1. Чтобы исключить возможность ошибки или опечатки, я приложу скриншот.

Теперь суть задачи, на которой возникла проблема (вообще конечная цель – динамическая индикация, но проблема возникла на ТУПОМ ВЫВОДЕ БИТ В РЕГИСТР).
Напомню, как управлять регистром.

1.Кладем в 0 линии управления ReadData (SH_CP) и ShowData (ST_CP)

2.На линию Data (DS) выводим тот логический уровень, который должен быть занесен в регистр.

3.Поднимаем ReadData (SH_CP) в ЛОГ1, чуточку ждем, кладем ReadData (SH_CP) в ЛОГ0. Это приводит к считыванию бита с Data (DS) в регистр.

Повторяем пункты 2-3 нужное количество раз. В моем случае 16. Нужно заполнить 2 восьмибитных регистра.

4. Поднимаем ShowData (ST_CP) в ЛОГ1, чуточку ждем, кладем ShowData (ST_CP) в ЛОГ0. Это приводит к выводу записанных в регистр бит на порт регистра.

В принципе, всё очень просто, совершенно тупое дерганье ногами.

В моем случае один регистр управляет катодами индикатора. Второй регистр через транзисторы управляет общими анодами. Как уже говорилось, нужно отправлять в них два байта.

Я решил сделать следующим образом:

Код:

volatile unsigned char Kod_Znaka = 0;   // Код цифры
volatile unsigned char Kod_Vklucheniya = 0;   // Код разряда
volatile unsigned char i = 0;  // Счетчик, который используется сдвиговым регистром
volatile unsigned int SRData = 0; // 2 байта, выводящиеся в регистр.

volatile я дописал в процессе схождения с ума из-за не понимания происходящего.
Сделать i глобальной переменной я решил по той же причине.

Из массива с кодами символов я получаю какой-то код. Например для цифры 5:

Код:

Kod_Znaka = digits[5];

//Второй байт несет в себе код, который откроет транзистор нужного мне разряда.

Kod_Vklucheniya = 0x01; // 0b00000001

//Из них я складываю двухбайтное число:

SRData = (Kod_Vklucheniya << 8) + Kod_Znaka;

//До этого момента все идет хорошо, я смотрел в симуляторе.
//Если, например,
//Kod_Vklucheniya == 0b11001100
//Kod_Znaka == 0b00001111
//То SRData == 0b1100110000001111

//Далее простецкий цикл вывода SRData по биту в регистр:

// Shift register
#define PORT_DATA PORTD
#define PinData PIND1
#define PinReadData PIND3
#define PinShowData PIND4
// Определения находятся наверху программы. Привожу их чтобы вы не решили, что я их забыл

Далее код вывода бит в регистр:

Код:

for (i=0; i<16; i++) // 16 раз, для каждого бита повторяем одно и то же
   {
if (SRData & 0x80)// Чему равен старший бит, тому будет равен вывод Data (DS)
   {
      PORT_DATA |= (1<<PinData);
   }
   else
   {
      PORT_DATA &= (~(1<<PinData));
   }

      _delay_us(100);            // Чуть ждем хз зачем
   PORT_DATA |= (1<<PinReadData);      // Запись бита в сдвиговый регистр
   _delay_us(100);
   PORT_DATA &= (~(1<<PinReadData));

         SRData1 <<= 1;// Сдвиг битов влево, чтобы получить следующий бит

         }

   PORT_DATA |= (1<<PinShowData);   // Вывод данных в порт регистра
   _delay_us(100);
   PORT_DATA &= (~(1<<PinShowData));

Это, в принципе весь код, который тут должен отработать. Но при просмотре действий программы в симуляторе я видел какой-то бред. Программа то тупо пропускала по 3-4 строки,
то оптимизировалась так, что если нужно было поднять в ЛОГ1 Data (DS), а потом (ПОСЛЕ ЭТОГО, ПРЯМ ПОДОЖДАТЬ НАДО) передернуть ReadData (SH_CP), чтобы записать бит в регистр, программа оптимизировала задержку и одновременно поднимала в ЛОГ1 оба вывода, приводя к непредсказуемому значению, записывающемуся в регистр.

Теперь забегая вперед я скажу, что цели я достиг – динамическая индикация работает. Но что не так в приведенном примере я не понимаю. Решение проблемы следующее:

Делаем не один цикл из 16 повторений с 2 байтным числом, а 2 цикла из 8 повторений с двумя однобайтными числами. И все работает как задумано. То есть делаем вот так 2 раза:

Код:

for (i=0; i<8; i++) // 16 раз, для каждого бита повторяем одно и то же
   {
if (SRData & 0x80)// Чему равен старший бит, тому будет равен вывод Data (DS)
   {
      PORT_DATA |= (1<<PinData);
   }
   else
   {
      PORT_DATA &= (~(1<<PinData));
   }

      _delay_us(100);            // Чуть ждем хз зачем
   PORT_DATA |= (1<<PinReadData);      // Запись бита в сдвиговый регистр
   _delay_us(100);
   PORT_DATA &= (~(1<<PinReadData));

         SRData1 <<= 1;// Сдвиг битов влево, чтобы получить следующий бит

         }

Только меняем значение SRData при втором прогоне этого цикла и после обоих прогонов добавляем

Код:

PORT_DATA |= (1<<PinShowData);   // Вывод данных в порт регистра
_delay_us(100);
PORT_DATA &= (~(1<<PinShowData));

Исходники обеих программ я прикладываю.

Суть всего поста в том, что мне необходимо понять компилятор. Можете подсказать, в каком месте я допускаю ошибку? Я на этот бред убил 2 вечера. И на этот пост около часа. Хочется окупить потерянное время приобретенными знаниями. Заранее большое спасибо!

Вложения:


Готовый вариант, где все работает.c [3.7 KiB]

Скачиваний: 502



Вариант, где всё НЕ работает.c [2.72 KiB]

Скачиваний: 378



Схема.png [36.93 KiB]

Скачиваний: 563



Screenshot_1.png [26.61 KiB]

Скачиваний: 588


_________________
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.

Вернуться наверх
 

ПрофильПрофиль

 

Реклама

L.O.D

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Пт апр 01, 2016 03:41:19 

Карма: 4

Рейтинг сообщений: 3

Зарегистрирован: Чт фев 11, 2016 18:35:37
Сообщений: 139

Рейтинг сообщения: 0

Мikа писал(а):

мне необходимо понять компилятор. Можете подсказать, в каком месте я допускаю ошибку?

Если код программы, приведенный выше, честный копипаст, без ошибок, то есть пара предположений.
1. Вы сдвигаете 16-битное число, но достаете из него только 8 неопределенных бит, а еще 8 бит — заведомо нулевые, что если компилятор это просек? :) Ошибка повидимому вызвана метаниями между 8-и- и 16-битной версиями программы — счетчик цикла меняли, а маску старшего бита — нет:

Код:

if (SRData & 0x80)// Чему равен старший бит, тому будет равен вывод Data (DS)

Старший бит двухбайтного — не 0x80, а 0x8000.
2. Видно объявление переменной SRData, как unsigned int, а вот что там крутится 16 раз в цикле, не показано — может однобайтная переменная?

Код:

SRData1 <<= 1;// Сдвиг битов влево, …


_________________
— Из овощей я больше всего люблю пельмени… © Соседский Мальчик

Вернуться наверх
Реклама

Мikа

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Пт апр 01, 2016 08:54:54 

Потрогал лапой паяльник
Аватар пользователя

Карма: 4

Рейтинг сообщений: 13

Зарегистрирован: Пн апр 01, 2013 15:13:40
Сообщений: 343
Откуда: Москва

Рейтинг сообщения: 0

Здравствуйте! Большое спасибо за совет. Мне почему-то кажется, что дело как раз в этом. О маске я совсем не подумал. Вечером, как домой приду, проверю эту версию на устройстве, тк гонять в симуляторе будет не очень продуктивно с точки зрения времени. Я не могу моментально в голове переводить числа из десятичных в двоичные и т.п., а делать это с помощью калькулятора Windows будет та еще задача :) Относительно кода — это правда честная копипаста и, для верности я и файлы приложил :)
Насчет переменной SRData1 — она появилась в процессе разбиения 16ти разового цикла на 2 8ми разовых. Здесь я, видимо, скопировал не из той программы (не из 16 битной) :)


_________________
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.

Вернуться наверх

ARV

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Пт апр 01, 2016 09:25:55 

Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97

Рейтинг сообщений: 2032

Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 17890
Откуда: Новочеркасск

Рейтинг сообщения: 3

Медали: 2

Получил миской по аватаре (1)

Мявтор 3-й степени (1)

По поводу оптимизатора могу сказать пару общих слов, возможно вам, как ранее не знакомому с компилятором Си avr-gcc это окажется полезным.

1. оптимизацию имеет смысл делать либо -Os для получения минимального объема кода, либо -O3 для получения максимального быстродействия программы. лично в моей практике ни разу не было случая, чтобы я использовал что-то отличное от -Os
2. в процессе отладки программы с включенной оптимизацией вы обязательно увидите «чудеса», которые могут проявляться в том, что то цикл начинается не с первого оператора, а с середины, то вообще код исполняется не понятно как… это имеет одно простое объяснение: в процессе оптимизации компилятор создает такой код, ассемблерные команды которого не всегда можно разделить на группы, соответствующие конкретной строке исходника на Си. в итоге получается, что в процессе пошагового исполнения невозможно отобразить строку исходника, соответствующую текущему месту исполнения, а иногда и само место исполнения вообще не попадает на какую-то из строк программы. в этом случае отладочная информация оказывается не соответствующей действительности, что и приводит к странностям. однако, если ошибок в коде нет, истинное поведение программы всегда остается верным — странности чисто вешние в самом отладчике.

поэтому если участок кода по шагам проходит не пойми как, но состояние после этого странного участка правильное — это нормально и переживать не стоит.

что касается вывода в последовательные регистры, то нет смысла объединять байты в 16-битные слова, а затем их выводить. по всем статьям будет лучше работать побайтно.


_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется…

скушно, бабоньки!

Вернуться наверх
Реклама

Выгодные LED-драйверы для решения любых задач

КОМПЭЛ представляет со склада и под заказ широкий выбор LED-драйверов производства MEAN WELL, MOSO, Snappy, Inventronics, EagleRise. Линейки LED-драйверов этих компаний, выполненные по технологии Tunable White и имеющие возможность непосредственного встраивания в систему умного дома (димминг по шине KNX), перекрывают практически полный спектр применений: от простых световых указателей и декоративной подсветки до диммируемых по различным протоколам светильников внутреннего и наружного освещения.

Подобрать LED-драйвер>>

L.O.D

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Пт апр 01, 2016 09:42:38 

Карма: 4

Рейтинг сообщений: 3

Зарегистрирован: Чт фев 11, 2016 18:35:37
Сообщений: 139

Рейтинг сообщения: 0

Мikа писал(а):

Я не могу моментально в голове переводить числа из десятичных в двоичные и т.п., …

Видимо, Вы и на ассемблере писали не слишком много. :) Каждая шестнадцатиричная цифра переводится строго в одну двоичную тетраду. Ну а соответствие тетрад цифрам от 0 до F даже и запоминать необязательно — легко вычисляется на первых порах. Т.о.:

Цитата:

0x 8’0’0’0 == 0b 1000’0000’0000’0000

Мikа писал(а):

… а делать это с помощью калькулятора Windows будет та еще задача

Ничего подобного — переключение между шестнадцатиричной/десятичной/восьмиричной и двоичной системами осуществляется клавишами F5/F6/F7 и F8.


_________________
— Из овощей я больше всего люблю пельмени… © Соседский Мальчик

Вернуться наверх
Реклама

Реклама

LIMF – источники питания High-End от MORNSUN со стандартным функционалом на DIN-рейку

На склад Компэл поступили ИП MORNSUN (крепление на DIN-рейку) с выходной мощностью 240 и 480 Вт. Данные источники питания обладают 150% перегрузочной способностью, активной схемой коррекции коэффициента мощности (ККМ; PFC), наличием сухого контакта реле для контроля работоспособности (DC OK) и возможностью подстройки выходного напряжения. Источники питания выполнены в металлическом корпусе, ПП с компонентами покрыта лаком с двух сторон, что делает ее устойчивой к соляному туману и пыли. Изделия соответствуют требованиям ANSI/ISA 71.04-2013 G3 на устойчивость к коррозии, а также нормам ATEX для взрывоопасных зон.

Подробнее>>

Мikа

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Пт апр 01, 2016 11:15:08 

Потрогал лапой паяльник
Аватар пользователя

Карма: 4

Рейтинг сообщений: 13

Зарегистрирован: Пн апр 01, 2013 15:13:40
Сообщений: 343
Откуда: Москва

Рейтинг сообщения: 0

ARV, спасибо за совет. Насчет того, что лучше не мудрить и работать по возможности с однобайтными числами мне тоже в голову пришло :) Думаю стоит разобраться с дисассемблером в отладчике.

L.O.D, относительно перевода чисел в уме — я мел ввиду именно десятичные в двоичные. Это относится к моменту, когда в отладчике мы начинаем следить за какой-то переменной (в моём случае я следил за Kod_Znaka, Kod_Vklucheniya и SRData. Просто если там можно было бы отображать двоичные коды, то было бы проще понять, идёт все по плану или нет. Т.к. когда в десятичном виде мы видим, например 170 и 215, которые после загона в один байт дают, например 45837, я не могу понять, правильно ли прошла операция или нет :) (В этом примере я числа написал вылдуманные, не думаю, что 215 в старшем и 170 в младшем байте дадут именно 45837). Но пока я писал про это меня внезапно осенило, что там можно переключить на шестнадцатиричный вид отображения и там все будет видно сразу)) Кстати, что калькулятор можно переключать с помощью кнопок F я правда не знал, спасибо :))


_________________
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.

Вернуться наверх

L.O.D

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Пт апр 01, 2016 11:46:26 

Карма: 4

Рейтинг сообщений: 3

Зарегистрирован: Чт фев 11, 2016 18:35:37
Сообщений: 139

Рейтинг сообщения: 0

Мikа писал(а):

внезапно осенило, что там можно переключить на шестнадцатиричный вид отображения

Дык!!! :)))


_________________
— Из овощей я больше всего люблю пельмени… © Соседский Мальчик

Вернуться наверх

Мikа

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 09:56:17 

Потрогал лапой паяльник
Аватар пользователя

Карма: 4

Рейтинг сообщений: 13

Зарегистрирован: Пн апр 01, 2013 15:13:40
Сообщений: 343
Откуда: Москва

Рейтинг сообщения: 0

Здравствуйте, парни. Сейчас проверил программу, добавив в двухбайтную версию еще один байт в маску (0x80 00) и все работает. Ура!

Однако еще провел эксперимент относительно занимаемого программой места.

Вариант с однобайтными числами в функции вывода код в сдвиговый регистр занимает:

Program Memory Usage : 498 bytes 24,3 % Full
Data Memory Usage : 30 bytes 23,4 % Full

С двухбайтным числом занимает:

Program Memory Usage : 420 bytes 20,5 % Full
Data Memory Usage : 29 bytes 22,7 % Full

Как видно, второй вариант экономит 78 байт флеша и 1 байт оперативки. Для МК с 2К флеш и 120 б оперативки — очень даже неплохо.

Это на оптимизации -O1.

А вот на -Os

1 байтовые числа

Program Memory Usage : 486 bytes 23,7 % Full
Data Memory Usage : 30 bytes 23,4 % Full

2 байтове число.

Program Memory Usage : 414 bytes 20,2 % Full
Data Memory Usage : 29 bytes 22,7 % Full

В общем есть с чем поэкспериментировать. И у меня еще появился вопрос на засыпку:
Что означают эти варнинги?

Warning implicit declaration of function ‘SR’ [-Wimplicit-function-declaration] Gsxr-Main C:UsersМихаилOneDrive! — Мои проектыGsxRGsxr-MainGsxr-Mainmain.c 66
Severity Code Description Project File Line
Warning conflicting types for ‘SR’ Main C:UsersMick\MainMainMainmain.c 152

P.S. Вот 1 и 2 байтные функции:

UPD: Щас заметил, что если к вызову функции добавить void, то варнинги пропадают, но функция не работает.
То есть было Encoder(); — функция работала и были варнинги.
Стало void Encoder(void); — функции нет и варнингов нет))

И судя по размеру выходной прошивки — функцию вообще нафиг выкидывает.


_________________
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.

Вернуться наверх

ARV

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 10:16:25 

Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97

Рейтинг сообщений: 2032

Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 17890
Откуда: Новочеркасск

Рейтинг сообщения: 0

Медали: 2

Получил миской по аватаре (1)

Мявтор 3-й степени (1)

с вашим подходом все может быть… я бы делал так

Код:

static void send_byte(uint8_t data){
   for(uint8_t mask=0x80; mask; mask >>= 1){
      if(data & mask)
         PORT_DATA |= _BV(PinData);
      else
         PORT_DATA &= ~_BV(PinData);
      _delay_us(1);
      PORT_DATA |= _BV(PinReadData);
      _delay_us(1);
      PORT_DATA &= ~_BV(PinReadData);
   }
}

static void send_word(uint16_t data){
   send_byte(data); // младший байт
   send_data(data >> 8); // старший байт
}

задержка в принципе вообще не нужна, т.к. регистр 595-й способен работать на 20 МГц запросто, а у вас МК с куда более низкой частотой, причем код изменения бита на Си явно будет иметь длительность в несколько тактов, но если уж очень хочется, хватит и задержки в 1 мкс

в функции send_word может быть надо в обратном порядке байты выводить — это вам виднее…


_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется…

скушно, бабоньки!

Вернуться наверх

L.O.D

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 10:56:24 

Карма: 4

Рейтинг сообщений: 3

Зарегистрирован: Чт фев 11, 2016 18:35:37
Сообщений: 139

Рейтинг сообщения: 0

Мikа писал(а):

Щас заметил, что если к вызову функции добавить void, то варнинги пропадают, но функция не работает.

Всего проекта не вижу (он вообще выложен где-то?) поэтому могу только предположить:
Если тип функции не указан вовсе, то предполагается int. Если в том месте, где она вызывается, она будет объявлена с типом, отличным от int, то это уже будет другая функция (они объявлены глобальными — сообщение о конфликте типов), а первая останется без вызовов и потому будет удалена из объектного кода цели.

ARV писал(а):

я бы делал так

Или по такому принципу:

Код:

void SRSend(uint16_t data){
uint16_t mask=0x8000;

        do {

           DataPort.bData  = ((data & mask) > 0);
           DataPort.bStrob = 1;
           // asm(«nop»);
           DataPort.bStrob = 0;

        } while (mask >>= 1);
}


_________________
— Из овощей я больше всего люблю пельмени… © Соседский Мальчик

Вернуться наверх

Мikа

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 12:22:01 

Потрогал лапой паяльник
Аватар пользователя

Карма: 4

Рейтинг сообщений: 13

Зарегистрирован: Пн апр 01, 2013 15:13:40
Сообщений: 343
Откуда: Москва

Рейтинг сообщения: 0

Я на уровне «дно» нахожусь, т.к. не понимаю 23 вашего кода. Но я только учусь Си, даже книжку читаю :)

Весь проект я прилагаю в этом сообщении.

На данный момент программа:

Опрашивает энкодер => меняет значение Koefficient.
Разделяет Koefficient на 3 отдельных числа
Выводит разделенный Koefficient на трехразрядный индикатор.

Обратите внимание, что на данный момент программ пишется (вот прям щас сижу и пишу), поэтому она совсем «не причесана». Но я уверен, что даже если б я её «причесал», выглядела бы она не очень. Поэтому буду благодарен за любую критику и советы, спасибо, что уделяете время.

Вложения:


Main.zip [36.09 KiB]

Скачиваний: 161


_________________
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.

Вернуться наверх

L.O.D

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 12:59:30 

Карма: 4

Рейтинг сообщений: 3

Зарегистрирован: Чт фев 11, 2016 18:35:37
Сообщений: 139

Рейтинг сообщения: 0

Мikа писал(а):

Я на уровне «дно» нахожусь, …

Значит впереди много интересного. :)

Мikа писал(а):

Весь проект я прилагаю в этом сообщении.

Ну, так и есть — сначала встречается вызов функции (строка 72) и только потом — её объявление и реализация (строка 195). То есть, в строке 72 рождается неявное объявление функции «int Encoder();«, которое позже вступает в конфликт с явным объявлением «void Encoder();«.
Для начала можно дать явное объявление функции до её первого вызова. А вообще, полезно выделить функции работы с енкодером (или иным периф.устройством) в отдельный .c-модуль со своим .h-файлом и включить .h-файл в main.c.
Если позже эти функции понадобятся в другом проекте, их не придется выдирать из main.c.

P.S. Кстати — по поводу опроса енкодера


_________________
— Из овощей я больше всего люблю пельмени… © Соседский Мальчик

Вернуться наверх

COKPOWEHEU

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 13:17:08 

Это не хвост, это антенна
Аватар пользователя

Карма: 8

Рейтинг сообщений: 193

Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1394

Рейтинг сообщения: 0

Форматирование на удивление неплохое. Местами нелогичные отступы, слишком разреженный, на мой вкус, код, названия переменных транслитом и прочие мелкие недочеты. Но гораздо лучше, чем у многих на форумах.
Вот этот момент стоит переделать. НИКОГДА не используйте goto в коде на языке высокого уровня. Пара исключений, конечно, есть, но сначала научитесь обходиться без эого.

Цитата:

Sotni:
if (KoefficientSEC >= 100)
{
KoefficientSEC = KoefficientSEC — 100;
Sotni++;
goto Sotni;
}

Здесь стоит использовать цикл

Код:

while( koefficientSec >= 100 ){ //Один из стандартов рекомендует именовать переменные со строчной буквы, константы капсом и т.д.
  koefficientSec -= 100; //Оператор -= и записывается короче, и ошибиться труднее, да и для понимания проще
  thousands++; //Именование переменных транслитом — зло.
}

Альтернативный вариант — использовать деление. Что выгоднее по скорости и объему кода не знаю

Код:

thousands = koefficientSec / 100;
tens = (koefficientSec % 100) / 10;
units = koefficientSec % 10;

Функцию SR однозначно стоит переписать. Как минимум, называть метку внутри нее одинаково с самой функцией — плохая идея. Не говоря о том, что goto — всегда плохая идея. Ну и описания назначения этой функции в коде нет, а должно бы. Ну и да, L.O.D правильно пишет — сначала объявляете функцию и только потом используете.

Вернуться наверх

Мikа

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 13:52:01 

Потрогал лапой паяльник
Аватар пользователя

Карма: 4

Рейтинг сообщений: 13

Зарегистрирован: Пн апр 01, 2013 15:13:40
Сообщений: 343
Откуда: Москва

Рейтинг сообщения: 0

L.O.D.

По поводу функции опроса энкодера — я опять же не понял, как сработает то, что вы написали. нужно внимательно над этим подумать. Да и двухмерные массивы я никогда не использовал раньше.

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

Цитата:

Для начала можно дать явное объявление функции до её первого вызова. А вообще, полезно выделить функции работы с енкодером (или иным периф.устройством) в отдельный .c-модуль со своим .h-файлом и включить .h-файл в main.c.

Вот это МОЯ МЕЧТА! Но пока у меня ничего не получилось. Не дочитался еще до этого, а какой-то вменяемой статьи «как вынести кусок кода в отдельный файл» я не встретил. Может быть не правильно искал, т.к. я упорно называл это библиотекой :)
В ассемблере я просто использовал include и проблем не было, но Си требует какие-то сложности, вроде .h файла, которые мне пока еще неведомы.

COKPOWEHEU

Относительно форматирования, а точнее лишних пробелов и отступов — это можно отнести к «причесыванию программы», когда блок однозначно начинает работать так, как надо, я его нормально форматирую и двигаюсь дальше.

Относительно коротких записей вроде a -=a; — это я тоже в курсе, использую и так и так.
Про общепринятые стандарты называния переменных Венгерская нотация и что-то там еще — я тоже читал. Ну вроде называть с маленькой буквы, писать без пробелов и каждое новое слово с большой буквы и похожие варианты.

Вроде:
variableBlack
VariableBlack

На транслите я их начал называть когда поймал себя на том, что в какой-то момент я сам начинаю путаться в красивых названиях на английском языке. По английски я свободно говорю, проблема не в нем, а втом, что я начинаю просто забывать путаться в том, что и как я назвал. Тот же код обработки индикатора. Там можно использовать слова:
Segment
Digit
Dot.
В какой-то момент я могу затупить и не понимать, что я назвал сегментом. То ли часть символа, то ли одну цифру целиком :)

P.S. Если подскажете как в отдельный файл вынести функцию и как ее подключить к проекту (или ссылку на нормальную статью), будет прям очень круто :)

UPD:

Кстати, L.O.D., в вашем комментарии относительно энкодера вы делаете массив из беззнаковых переменных unsigned char, а в самом массиве числа со знаком. Тут какая-то фишка запрятана?

COKPOWEHEU, ваш вариант с заменой if и goto в месте разбиения трехзначного числа на однозначные еще и 8 байт экономт :)

А этот вариант

Код:

thousands = koefficientSec / 100;
tens = (koefficientSec % 100) / 10;
units = koefficientSec % 10;

Вообще 22 байта и позволяет не использовать лишнюю (теперь уже) переменную KoefficientSEC, которая использовалась для того, чтобы не потерять значение переменной Koefficient.

Знаете, должен вам признаться, сегодняшнее общение на форуме мне новые горизонты открывает :)

Еще UPD: когда я убрал goto оттуда, где идет вывод в сдвиговый регистр (goto SR) и заменил это на while, программа увеличилась на 6 байт. И тут я вспомнил, что преподаватель с сайта ITVDN.com рассуждал о goto и очень яростно утверждал, что надо читать какие-то две книги, чтобы понимать, как его использовать и т.п. Мне вообще казалось, что он своему коллеге сейчас в нос даст за то, что тот не аргументируя назвал goto злом :D Мне просто как-то нужно было на работе допилить ПКшную программу на C# и я по быстрому вникал в этот язык :)


_________________
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.

Вернуться наверх

mrFox

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 16:09:09 

Нашел транзистор. Понюхал.

Карма: 1

Рейтинг сообщений: 25

Зарегистрирован: Пт сен 21, 2007 17:53:23
Сообщений: 190
Откуда: Зарайск

Рейтинг сообщения: 0

L.O.D писал(а):

Компилятор может не поддерживать битовые поля
так надежнее:

Mika писал(а):

В ассемблере я просто использовал include и проблем не было, но Си требует какие-то сложности, вроде .h файла, которые мне пока еще неведомы.

так и в С просто подключаешь #include и все, надо только не забыть описания функций туда перенести
единственно надо озаботится охраной от повторного включения (нормальные ИДЕ правла сами это делают)

Код:

#ifndef имя_файла
#defina имя_файла
// здесь описания функции
#endif

по поводу опитимизации — включить вывод листинга и смотреть на код

Вернуться наверх

L.O.D

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 16:41:27 

Карма: 4

Рейтинг сообщений: 3

Зарегистрирован: Чт фев 11, 2016 18:35:37
Сообщений: 139

Рейтинг сообщения: 0

Мikа писал(а):

По поводу функции опроса энкодера — я опять же не понял, как сработает

Оператор switch и вложенные в case’ы if’ы ставят в соответствие двум значениям (Encoder_NewState и Encoder_State) значение приращения к Encoder_Summ. Массив делает то же самое.

Мikа писал(а):

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

Это тоже сработает, но избегать строгости — это плохая привычка, поэтому лучше привыкать к порядку.

Мikа писал(а):

Но пока у меня ничего не получилось. … Си требует какие-то сложности, вроде .h файла, которые мне пока еще неведомы.

Мikа писал(а):

Если подскажете как в отдельный файл вынести функцию и как ее подключить к проекту (или ссылку на нормальную статью), будет прям очень круто

1. Добавить в проект новый .c-файл, написать в его начале соответствующий #include «…»
2. Перенести в него код функций
3. Создать тот самый заголовочный файл и перенести в него объявления соответствующих переменных и функций.
Например:

Мikа писал(а):

в вашем комментарии относительно энкодера вы делаете массив из беззнаковых переменных unsigned char, а в самом массиве числа со знаком. Тут какая-то фишка запрятана?

Нет, просто лень было писать с нуля — редактировал тот кусок кода, что был выше, вот и пропустил.

mrFox писал(а):

Компилятор может не поддерживать битовые поля

Во-первых — это часть стандарта Си, если компилятор его не поддерживает, то выходит это компилятор с другого языка. Во-вторых — написано же было: «по такому принципу», — это ни о чем не говорит? Отличие того кода совсем в другом. :dont_know:


_________________
— Из овощей я больше всего люблю пельмени… © Соседский Мальчик

Вернуться наверх

COKPOWEHEU

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 17:28:58 

Это не хвост, это антенна
Аватар пользователя

Карма: 8

Рейтинг сообщений: 193

Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1394

Рейтинг сообщения: 0

Мikа писал(а):

Знаете, должен вам признаться, сегодняшнее общение на форуме мне новые горизонты открывает :)

Когда человек приходит на форум и не грубит, пишет по-человечески (без дурацких орфографических и прочих ошибок хотя бы), по-человечески же форматирует код (вот честно, вы едва ли не первый из новичков, кто этим не пренебрегает), тогда и ему помогут.
На счет разделения на несколько файлов L.O.D. недостаточно подробно расписал.
Вот заготовка:

После этого все *.c файлы надо подключить к проекту в среде разработки. Либо в makefile. Впрочем, наверное, вам лазить туда рановато. Вот добавить файл к проекту надо.
Альтернативный вариант — обойтись без *.c файла, разместив код в *.h — файле. Проблема в том, что такой файл нельзя подключать в несколько *.c-файлов. Впрочем, можете поэкспериментировать.

Цитата:

Относительно варнингов

Их надо исправлять. Исключения можно по пальцам пересчитать и вы на них едва ли наткнетесь.

Цитата:

преподаватель с сайта ITVDN.com рассуждал о goto и очень яростно утверждал, что надо читать какие-то две книги, чтобы понимать, как его использовать

Случаи где goto к месту, то есть улучшает читаемость, быстродействие или объем, существуют, но их всего несколько. Единственный случай, который мне вспоминается — выход из нескольких вложенных циклов. Однако лично мне его использовать не пришлось ни разу.
Учиться программировать на ЯВУ надо строго без использования этого оператора. Когда наберетесь опыта и наткнетесь на ситуацию, где его использование могло бы быть выгодно — рассмотрите вариант без goto (где-то читал, что доказали, что это возможно всегда, но не всегда оптимально) и сравните с тем. Вот если обходной вариант уж слишком запутан и это никак не исправить, применяйте. Только задокументируйте, что это действительно оптимальный вариант и что альтернативы оказались хуже.

Цитата:

Про общепринятые стандарты называния переменных … писать без пробелов

Ну, без пробелов — особенности компиляторов. Рекомендации по стилю это всего лишь рекомендации, стандартов куча и все разные.

Вернуться наверх

Мikа

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 17:51:41 

Потрогал лапой паяльник
Аватар пользователя

Карма: 4

Рейтинг сообщений: 13

Зарегистрирован: Пн апр 01, 2013 15:13:40
Сообщений: 343
Откуда: Москва

Рейтинг сообщения: 0

Так, мечты сбываются, спасибо! Сейчас попробую вынести функции в отдельный файл.

Тут был вопрос, который я уже решил. Из него вынес следующее:

Если вы в симуляторе смотрите Си программу и вас интересует заход программы в обработчик прерывания — следите не за тем, куда программа шагает а за переменными в обработчике.
Как вы вчера говорили и как и было в прошлый раз — симулятор не удосуживается прыгать в обработчик, но действие в нём выполняется :)

Большой UPD относительно выноса кода в отдельные файлы.

Я напишу по порядку что делал.

1. Создаю файлы EncoderExt.c и EncoderExt.h(Include File), файлы лежат в папке проекта вместе с main.c

2. Переношу в них код, оформляя как вы указали (см приложенные файлы).

3. Добавляю файлы в проект (см. скриншот)

4. Пишу в main.c

Код:

#include «EncoderExt.h» // В самом верху, где подключаются остальные файлы.

5. Компилирую и получаю два варианта развития событий:

5.1 Если оставить все, как описано выше, получаются следующие ошибки:

Severity Code Description Project File Line
Error ‘Koefficient’ undeclared (first use in this function)
Error ‘Encoder_NewState’ undeclared (first use in this function)
Error ‘Encoder_State’ undeclared (first use in this function)
Error ‘Encoder_Summ’ undeclared (first use in this function)

Если в Encoder.h заменить строки

Код:

#ifndef EncoderMacro //имя макроопределения может быть любым. Для простоты можно использовать имя файла
#define EncoderMacro //главное чтобы оно было одинаково в этой и предыдущей строках

На такие

Код:

#ifndef Encoder //имя макроопределения может быть любым. Для простоты можно использовать имя файла
#define Encoder //главное чтобы оно было одинаково в этой и предыдущей строках

То получаются такие ошибки:

Severity Code Description Project File Line
Error expected identifier or ‘(‘ before ‘)’ token
Error expected identifier or ‘(‘ before ‘)’ token

Двойной клик по первой приводит сюда:

Код:

EncoderExt.c

#include <avr/io.h>
#include «EncoderExt.h» //подключаем файл с прототипами функций

void Encoder(void) // <— Курсор становится в эту строку между ( и void

Двойной клик по второй ошибке приводит сюда:

Код:

EncoderExt.h

#ifndef Encoder //имя макроопределения может быть любым. Для простоты можно использовать имя файла
#define Encoder //главное чтобы оно было одинаково в этой и предыдущей строках
void Encoder(); Курсор становится в этой строке между скобками

Судя по весему в первом варианте не правильно называю макроопределение и программа вообще не видит ничего.
А во втором случае где-то я допускаю небольшую ошибку. Где-то я не поставил какой-то return?


_________________
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.

Вернуться наверх

COKPOWEHEU

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Сб апр 02, 2016 20:13:00 

Это не хвост, это антенна
Аватар пользователя

Карма: 8

Рейтинг сообщений: 193

Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1394

Рейтинг сообщения: 0

Цитата:

Если вы в симуляторе смотрите Си программу и вас интересует заход программы в обработчик прерывания — следите не за тем, куда программа шагает а за переменными в обработчике.
Как вы вчера говорили и как и было в прошлый раз — симулятор не удосуживается прыгать в обработчик, но действие в нём выполняется :)

Отключите оптимизацию (флаг -O0). У меня в AVRStudio 4.18, да и протеусе нормально заходил в обработчик прерывания.

Цитата:

3. Добавляю файлы в проект (см. скриншот)

Насчет добавления в раздел library не уверен, может так и надо, хотя выглядит странно. Добавлять туда *.h-файл не нужно, он там будет только мешать.

Цитата:

#ifndef Encoder
#define Encoder
void Encoder(); Курсор становится в этой строке между скобками

Опять ходите по тем же граблям. Определяете одно и то же имя несколькими разными способами. В примере я не зря так над ним извращался — добавлял подчеркивания и капс — чтобы минимизировать шанс что такой набор символов случайно попадется где-то еще.
Кстати, мои комментарии из шаблона могли бы и удалить :-) они особого смысла не несут и написаны только для вас, остальным действия этих команд очевидны.

Цитата:

5.1 Если оставить все, как описано выше, получаются следующие ошибки:

Эти переменные не объявлены в файле EncoderExt.c. Каждый *.c файл компилируется независимо от остальных, поэтому используемые функции и переменные должны быть объявлены хотя бы только прототипами. В вашем случае стоит сделать так:

Код:

signed char encoder_sum = 0; //или как оно у вас объявлено
void Encoder(void){
   char encoder_newstate = PINB & 0x03; //эту переменную можно сделать локальной
   static char encoder_state = encoder_newstate; //модификатор static означает, что после завершения функции переменная останется в памяти и не изменится до следующего вызова
   encoder_newstate = PINB & 0x3;
   if(encoder_state != encoder_newstate)

А в заголовочном файле (*.h) надо добавить объявление переменной encoder_sum:

Код:

extern signed char encoder_sum;

Что с koefficient’ом решайте сами, нужен ли он и какую роль исполняет.
Но, вообще-то, использование разделяемых между несколькими файлами переменных довольно опасная идея. Лучше оформить доступ через функции. Не объявляем encoder_sum в заголовочном файле, зато объявляем следующие прототипы:

Код:

void set_encoder_sum(signed char sum);
signed char get_encoder_sum();

А в файле исходного кода (*.c) описываем реализацию

Код:

void set_encoder_sum(signed char sum){encoder_sum = sum;}
signed char get_encoder_sum(){return encoder_sum;}

Это несколько ухудшит производительность, зато несколько безопаснее. Труднее изменить эту переменную случайно, а если это не нужно, функцию set_encoder_sum() можно вообще убрать. Кстати, прошу прощения за функции-в-одну-строчку, но если они выполняют одно действие, читаемость не ухудшается.
Да, чуть не забыл. Если отлаживаете платформо-независимве особенности, на ПК-версии это обычно проще. Ну и стоит поучить сам язык Си (да и ассемблер). Учебник Кернигана и Ричи — классический старт. Большинство особенностей Си у них описано.

Вернуться наверх

L.O.D

Не в сети

Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR

СообщениеДобавлено: Вс апр 03, 2016 03:33:18 

Карма: 4

Рейтинг сообщений: 3

Зарегистрирован: Чт фев 11, 2016 18:35:37
Сообщений: 139

Рейтинг сообщения: 0

COKPOWEHEU писал(а):

На счет разделения на несколько файлов L.O.D. недостаточно подробно расписал.

Прошу прощения, но мое описание совпадает с Вашим, с точностью до имен переменных или файлов. :)))

Мikа писал(а):

получаются следующие ошибки:

Error ‘Koefficient’ undeclared (first use in this function)
Error ‘Encoder_NewState’ undeclared (first use in this function)
Error ‘Encoder_State’ undeclared (first use in this function)
Error ‘Encoder_Summ’ undeclared (first use in this function)

Undeclared — необъявленные. А ведь я писал ранее:

L.O.D писал(а):

1. Добавить в проект новый .c-файл, написать в его начале соответствующий #include «…»

3. Создать тот самый заголовочный файл и перенести в него объявления соответствующих переменных и функций.
Например:

Правда, в дальнейшем придется несколько нарастить сложность таких объявлений, но об этом позже — от простого к сложному.


_________________
— Из овощей я больше всего люблю пельмени… © Соседский Мальчик

Вернуться наверх

Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 6

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

Понравилась статья? Поделить с друзьями:
  • Sims 2 ошибка приложение завершит работу
  • Sim error remaining in boot fw perform a double download without a power cycle
  • Siemens masterdrives ошибки
  • Severe error 0x4050002
  • Sims 2 как изменить стремление