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
44k21 gold badges151 silver badges272 bronze badges
asked Nov 30, 2015 at 16:05
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
44k21 gold badges151 silver badges272 bronze badges
answered Dec 1, 2015 at 9:14
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
44k21 gold badges151 silver badges272 bronze badges
asked Nov 30, 2015 at 16:05
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
44k21 gold badges151 silver badges272 bronze badges
answered Dec 1, 2015 at 9:14
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
Копался с 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 |
|||
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 |
но почему так? Там, где компилятор будет делать инстанс шаблона, ему нужно видеть реализацию шаблона, а не только прототип. Множественных определений, как было бы с реализациями функций, при подключении такого .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 1Why 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).
|
|||||
Strange compile errors (Read 3134 times)
Abbott HMG
Junior Member Posts: 56 Joined: May 10th, 2019 |
Strange compile errors |
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: These public Log Class properties are used throughout the project. Code
// 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. 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 |
||
IP Logged |
Tim@Visual Micro Administrator Posts: 11684 Joined: Apr 10th, 2010 |
Re: Strange compile errors |
Print Post |
Please try clicking «build>clean solution» then build and repost the verbose output if there is still a problem. |
||
WWW IP Logged |
Abbott HMG
Junior Member Posts: 56 Joined: May 10th, 2019 |
Re: Strange compile errors |
Print Post |
Same result. |
||
Please Register or Login to the Forum to see File Attachments |
||
IP Logged |
Tim@Visual Micro Administrator Posts: 11684 Joined: Apr 10th, 2010 |
Re: Strange compile errors |
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. |
||
WWW IP Logged |
Abbott HMG
Junior Member Posts: 56 Joined: May 10th, 2019 |
Re: Strange compile errors |
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 |
||
IP Logged |
Tim@Visual Micro Administrator Posts: 11684 Joined: Apr 10th, 2010 |
Re: Strange compile errors |
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 |
||
WWW IP Logged |
Abbott HMG
Junior Member Posts: 56 Joined: May 10th, 2019 |
Re: Strange compile errors |
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. |
||
IP Logged |
Tim@Visual Micro Administrator Posts: 11684 Joined: Apr 10th, 2010 |
Re: Strange compile errors |
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++)
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 » |
||
WWW IP Logged |
Abbott HMG
Junior Member Posts: 56 Joined: May 10th, 2019 |
Re: Strange compile errors |
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. |
||
Please Register or Login to the Forum to see File Attachments |
||
IP Logged |
Tim@Visual Micro Administrator Posts: 11684 Joined: Apr 10th, 2010 |
Re: Strange compile errors |
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. |
||
WWW IP Logged |
Abbott HMG
Junior Member Posts: 56 Joined: May 10th, 2019 |
Re: Strange compile errors |
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 |
||
IP Logged |
Tim@Visual Micro Administrator Posts: 11684 Joined: Apr 10th, 2010 |
Re: Strange compile errors |
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. |
||
WWW IP Logged |
Abbott HMG
Junior Member Posts: 56 Joined: May 10th, 2019 |
Re: Strange compile errors |
Print Post |
I agree. Sorry for the time wasted. |
||
IP Logged |
Форум РадиоКот • Просмотр темы — Помогите понять, что творит оптимизатор Си AVR
Сообщения без ответов | Активные темы
ПРЯМО СЕЙЧАС: |
Автор | Сообщение | |||||||
---|---|---|---|---|---|---|---|---|
|
Заголовок сообщения: Помогите понять, что творит оптимизатор Си AVR Добавлено: Пт апр 01, 2016 00:21:18 |
|||||||
Карма: 4 Рейтинг сообщения: 3
|
Здравствуйте. Сразу оговорюсь, что создал новую тему а не написал в «Несколько простых вопросов по Си AVR», т.к. вопрос для меня очень важный и не хочу, чтобы он затерялся в той ветке без ответа. Дело такое: писал я себе на ассемблере и горя не знал. Ну за исключением того, что это ассемблер и надо всё делать ручками. Ну так вот. Делаю простенькое устройство. Первое что решил написать – это часть кода, которая будет управлять трехразрядным семисегментным индикатором, схема которого ОА. Индикатор управляется через 2 последовательно соединенных сдвиговых регистра 74HC595D. Короче говоря, сдвиговые регистры подключены последовательно, то есть биты пройдя первый насквозь, попадают во второй. Выводы управления регистрами запараллелены между собой. линия данных (Data) (состояние с которой считывается в регистр), линия записи лог состояния с Data (ReadData) и линия вывода считанного байта на порт регистра (ShowData). Линии управления (Data, ReadData, ShowData) напрямую подключены к микроконтроллеру ATtiny2313A. На всякий случай оговорюсь, что земли Теперь идём к программе. Теперь суть задачи, на которой возникла проблема (вообще конечная цель – динамическая индикация, но проблема возникла на ТУПОМ ВЫВОДЕ БИТ В РЕГИСТР). 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 я дописал в процессе схождения с ума из-за не понимания происходящего. Из массива с кодами символов я получаю какой-то код. Например для цифры 5: Код: Kod_Znaka = digits[5]; //Второй байт несет в себе код, который откроет транзистор нужного мне разряда. Kod_Vklucheniya = 0x01; // 0b00000001 //Из них я складываю двухбайтное число: SRData = (Kod_Vklucheniya << + Kod_Znaka; //До этого момента все идет хорошо, я смотрел в симуляторе. //Далее простецкий цикл вывода SRData по биту в регистр: // Shift register Далее код вывода бит в регистр: Код: for (i=0; i<16; i++) // 16 раз, для каждого бита повторяем одно и то же _delay_us(100); // Чуть ждем хз зачем SRData1 <<= 1;// Сдвиг битов влево, чтобы получить следующий бит } PORT_DATA |= (1<<PinShowData); // Вывод данных в порт регистра Это, в принципе весь код, который тут должен отработать. Но при просмотре действий программы в симуляторе я видел какой-то бред. Программа то тупо пропускала по 3-4 строки, Теперь забегая вперед я скажу, что цели я достиг – динамическая индикация работает. Но что не так в приведенном примере я не понимаю. Решение проблемы следующее: Делаем не один цикл из 16 повторений с 2 байтным числом, а 2 цикла из 8 повторений с двумя однобайтными числами. И все работает как задумано. То есть делаем вот так 2 раза: Код: for (i=0; i<8; i++) // 16 раз, для каждого бита повторяем одно и то же _delay_us(100); // Чуть ждем хз зачем SRData1 <<= 1;// Сдвиг битов влево, чтобы получить следующий бит } Только меняем значение SRData при втором прогоне этого цикла и после обоих прогонов добавляем Код: PORT_DATA |= (1<<PinShowData); // Вывод данных в порт регистра Исходники обеих программ я прикладываю. Суть всего поста в том, что мне необходимо понять компилятор. Можете подсказать, в каком месте я допускаю ошибку? Я на этот бред убил 2 вечера. И на этот пост около часа. Хочется окупить потерянное время приобретенными знаниями. Заранее большое спасибо!
|
|||||||
Вернуться наверх |
Профиль
|
|||||||
Реклама | |
|
|
L.O.D
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Пт апр 01, 2016 03:41:19 |
Карма: 4 Рейтинг сообщения: 0
|
Мikа писал(а): мне необходимо понять компилятор. Можете подсказать, в каком месте я допускаю ошибку? Если код программы, приведенный выше, честный копипаст, без ошибок, то есть пара предположений. Код: if (SRData & 0x80)// Чему равен старший бит, тому будет равен вывод Data (DS) Старший бит двухбайтного — не 0x80, а 0x8000. Код: SRData1 <<= 1;// Сдвиг битов влево, … |
Вернуться наверх | |
Реклама | |
|
|
Мikа
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Пт апр 01, 2016 08:54:54 |
||
Карма: 4 Рейтинг сообщения: 0
|
Здравствуйте! Большое спасибо за совет. Мне почему-то кажется, что дело как раз в этом. О маске я совсем не подумал. Вечером, как домой приду, проверю эту версию на устройстве, тк гонять в симуляторе будет не очень продуктивно с точки зрения времени. Я не могу моментально в голове переводить числа из десятичных в двоичные и т.п., а делать это с помощью калькулятора Windows будет та еще задача Относительно кода — это правда честная копипаста и, для верности я и файлы приложил |
||
Вернуться наверх | |||
ARV
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Пт апр 01, 2016 09:25:55 |
||
Карма: 97 Рейтинг сообщения: 3
|
По поводу оптимизатора могу сказать пару общих слов, возможно вам, как ранее не знакомому с компилятором Си avr-gcc это окажется полезным. 1. оптимизацию имеет смысл делать либо -Os для получения минимального объема кода, либо -O3 для получения максимального быстродействия программы. лично в моей практике ни разу не было случая, чтобы я использовал что-то отличное от -Os поэтому если участок кода по шагам проходит не пойми как, но состояние после этого странного участка правильное — это нормально и переживать не стоит. что касается вывода в последовательные регистры, то нет смысла объединять байты в 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 Рейтинг сообщения: 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 Рейтинг сообщения: 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 Рейтинг сообщения: 0
|
Мikа писал(а): внезапно осенило, что там можно переключить на шестнадцатиричный вид отображения Дык!!! |
Вернуться наверх | |
Мikа
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 09:56:17 |
||
Карма: 4 Рейтинг сообщения: 0
|
Здравствуйте, парни. Сейчас проверил программу, добавив в двухбайтную версию еще один байт в маску (0x80 00) и все работает. Ура! Однако еще провел эксперимент относительно занимаемого программой места. Вариант с однобайтными числами в функции вывода код в сдвиговый регистр занимает: Program Memory Usage : 498 bytes 24,3 % Full С двухбайтным числом занимает: Program Memory Usage : 420 bytes 20,5 % Full Как видно, второй вариант экономит 78 байт флеша и 1 байт оперативки. Для МК с 2К флеш и 120 б оперативки — очень даже неплохо. Это на оптимизации -O1. А вот на -Os 1 байтовые числа Program Memory Usage : 486 bytes 23,7 % Full 2 байтове число. Program Memory Usage : 414 bytes 20,2 % Full В общем есть с чем поэкспериментировать. И у меня еще появился вопрос на засыпку: Warning implicit declaration of function ‘SR’ [-Wimplicit-function-declaration] Gsxr-Main C:UsersМихаилOneDrive! — Мои проектыGsxRGsxr-MainGsxr-Mainmain.c 66 P.S. Вот 1 и 2 байтные функции: UPD: Щас заметил, что если к вызову функции добавить void, то варнинги пропадают, но функция не работает. И судя по размеру выходной прошивки — функцию вообще нафиг выкидывает. |
||
Вернуться наверх | |||
ARV
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 10:16:25 |
||
Карма: 97 Рейтинг сообщения: 0
|
с вашим подходом все может быть… я бы делал так Код: static void send_byte(uint8_t data){ static void send_word(uint16_t data){ задержка в принципе вообще не нужна, т.к. регистр 595-й способен работать на 20 МГц запросто, а у вас МК с куда более низкой частотой, причем код изменения бита на Си явно будет иметь длительность в несколько тактов, но если уж очень хочется, хватит и задержки в 1 мкс в функции send_word может быть надо в обратном порядке байты выводить — это вам виднее… |
||
Вернуться наверх | |||
L.O.D
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 10:56:24 |
Карма: 4 Рейтинг сообщения: 0
|
Мikа писал(а): Щас заметил, что если к вызову функции добавить void, то варнинги пропадают, но функция не работает. Всего проекта не вижу (он вообще выложен где-то?) поэтому могу только предположить: ARV писал(а): я бы делал так Или по такому принципу: Код: void SRSend(uint16_t data){ do { DataPort.bData = ((data & mask) > 0); } while (mask >>= 1); |
Вернуться наверх | |
Мikа
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 12:22:01 |
||||
Карма: 4 Рейтинг сообщения: 0
|
Я на уровне «дно» нахожусь, т.к. не понимаю 23 вашего кода. Но я только учусь Си, даже книжку читаю Весь проект я прилагаю в этом сообщении. На данный момент программа: Опрашивает энкодер => меняет значение Koefficient. Обратите внимание, что на данный момент программ пишется (вот прям щас сижу и пишу), поэтому она совсем «не причесана». Но я уверен, что даже если б я её «причесал», выглядела бы она не очень. Поэтому буду благодарен за любую критику и советы, спасибо, что уделяете время.
|
||||
Вернуться наверх | |||||
L.O.D
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 12:59:30 |
Карма: 4 Рейтинг сообщения: 0
|
Мikа писал(а): Я на уровне «дно» нахожусь, … Значит впереди много интересного. Мikа писал(а): Весь проект я прилагаю в этом сообщении. Ну, так и есть — сначала встречается вызов функции (строка 72) и только потом — её объявление и реализация (строка 195). То есть, в строке 72 рождается неявное объявление функции «int Encoder();«, которое позже вступает в конфликт с явным объявлением «void Encoder();«. P.S. Кстати — по поводу опроса енкодера… |
Вернуться наверх | |
COKPOWEHEU
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 13:17:08 |
||
Карма: 8 Рейтинг сообщения: 0
|
Форматирование на удивление неплохое. Местами нелогичные отступы, слишком разреженный, на мой вкус, код, названия переменных транслитом и прочие мелкие недочеты. Но гораздо лучше, чем у многих на форумах. Цитата: Sotni: Здесь стоит использовать цикл Код: while( koefficientSec >= 100 ){ //Один из стандартов рекомендует именовать переменные со строчной буквы, константы капсом и т.д. Альтернативный вариант — использовать деление. Что выгоднее по скорости и объему кода не знаю Код: thousands = koefficientSec / 100; Функцию SR однозначно стоит переписать. Как минимум, называть метку внутри нее одинаково с самой функцией — плохая идея. Не говоря о том, что goto — всегда плохая идея. Ну и описания назначения этой функции в коде нет, а должно бы. Ну и да, L.O.D правильно пишет — сначала объявляете функцию и только потом используете. |
||
Вернуться наверх | |||
Мikа
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 13:52:01 |
||
Карма: 4 Рейтинг сообщения: 0
|
L.O.D. По поводу функции опроса энкодера — я опять же не понял, как сработает то, что вы написали. нужно внимательно над этим подумать. Да и двухмерные массивы я никогда не использовал раньше. Относительно варнингов я так понял, что можно перенести функции наверх, до основного цикла и все будет нормально. Цитата: Для начала можно дать явное объявление функции до её первого вызова. А вообще, полезно выделить функции работы с енкодером (или иным периф.устройством) в отдельный .c-модуль со своим .h-файлом и включить .h-файл в main.c. Вот это МОЯ МЕЧТА! Но пока у меня ничего не получилось. Не дочитался еще до этого, а какой-то вменяемой статьи «как вынести кусок кода в отдельный файл» я не встретил. Может быть не правильно искал, т.к. я упорно называл это библиотекой COKPOWEHEU Относительно форматирования, а точнее лишних пробелов и отступов — это можно отнести к «причесыванию программы», когда блок однозначно начинает работать так, как надо, я его нормально форматирую и двигаюсь дальше. Относительно коротких записей вроде a -=a; — это я тоже в курсе, использую и так и так. Вроде: На транслите я их начал называть когда поймал себя на том, что в какой-то момент я сам начинаю путаться в красивых названиях на английском языке. По английски я свободно говорю, проблема не в нем, а втом, что я начинаю просто забывать путаться в том, что и как я назвал. Тот же код обработки индикатора. Там можно использовать слова: P.S. Если подскажете как в отдельный файл вынести функцию и как ее подключить к проекту (или ссылку на нормальную статью), будет прям очень круто UPD: Кстати, L.O.D., в вашем комментарии относительно энкодера вы делаете массив из беззнаковых переменных unsigned char, а в самом массиве числа со знаком. Тут какая-то фишка запрятана? COKPOWEHEU, ваш вариант с заменой if и goto в месте разбиения трехзначного числа на однозначные еще и 8 байт экономт А этот вариант Код: thousands = koefficientSec / 100; Вообще 22 байта и позволяет не использовать лишнюю (теперь уже) переменную KoefficientSEC, которая использовалась для того, чтобы не потерять значение переменной Koefficient. Знаете, должен вам признаться, сегодняшнее общение на форуме мне новые горизонты открывает Еще UPD: когда я убрал goto оттуда, где идет вывод в сдвиговый регистр (goto SR) и заменил это на while, программа увеличилась на 6 байт. И тут я вспомнил, что преподаватель с сайта ITVDN.com рассуждал о goto и очень яростно утверждал, что надо читать какие-то две книги, чтобы понимать, как его использовать и т.п. Мне вообще казалось, что он своему коллеге сейчас в нос даст за то, что тот не аргументируя назвал goto злом Мне просто как-то нужно было на работе допилить ПКшную программу на C# и я по быстрому вникал в этот язык |
||
Вернуться наверх | |||
mrFox
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 16:09:09 |
Нашел транзистор. Понюхал.
Карма: 1 Рейтинг сообщения: 0
|
L.O.D писал(а): Компилятор может не поддерживать битовые поля Mika писал(а): В ассемблере я просто использовал include и проблем не было, но Си требует какие-то сложности, вроде .h файла, которые мне пока еще неведомы. так и в С просто подключаешь #include и все, надо только не забыть описания функций туда перенести Код: #ifndef имя_файла по поводу опитимизации — включить вывод листинга и смотреть на код |
Вернуться наверх | |
L.O.D
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 16:41:27 |
Карма: 4 Рейтинг сообщения: 0
|
Мikа писал(а): По поводу функции опроса энкодера — я опять же не понял, как сработает Оператор switch и вложенные в case’ы if’ы ставят в соответствие двум значениям (Encoder_NewState и Encoder_State) значение приращения к Encoder_Summ. Массив делает то же самое. Мikа писал(а): Относительно варнингов я так понял, что можно перенести функции наверх, до основного цикла и все будет нормально. Это тоже сработает, но избегать строгости — это плохая привычка, поэтому лучше привыкать к порядку. Мikа писал(а): Но пока у меня ничего не получилось. … Си требует какие-то сложности, вроде .h файла, которые мне пока еще неведомы. Мikа писал(а): Если подскажете как в отдельный файл вынести функцию и как ее подключить к проекту (или ссылку на нормальную статью), будет прям очень круто 1. Добавить в проект новый .c-файл, написать в его начале соответствующий #include «…» Мikа писал(а): в вашем комментарии относительно энкодера вы делаете массив из беззнаковых переменных unsigned char, а в самом массиве числа со знаком. Тут какая-то фишка запрятана? Нет, просто лень было писать с нуля — редактировал тот кусок кода, что был выше, вот и пропустил. mrFox писал(а): Компилятор может не поддерживать битовые поля Во-первых — это часть стандарта Си, если компилятор его не поддерживает, то выходит это компилятор с другого языка. Во-вторых — написано же было: «по такому принципу», — это ни о чем не говорит? Отличие того кода совсем в другом. |
Вернуться наверх | |
COKPOWEHEU
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 17:28:58 |
||
Карма: 8 Рейтинг сообщения: 0
|
Мikа писал(а): Знаете, должен вам признаться, сегодняшнее общение на форуме мне новые горизонты открывает Когда человек приходит на форум и не грубит, пишет по-человечески (без дурацких орфографических и прочих ошибок хотя бы), по-человечески же форматирует код (вот честно, вы едва ли не первый из новичков, кто этим не пренебрегает), тогда и ему помогут. После этого все *.c файлы надо подключить к проекту в среде разработки. Либо в makefile. Впрочем, наверное, вам лазить туда рановато. Вот добавить файл к проекту надо. Цитата: Относительно варнингов Их надо исправлять. Исключения можно по пальцам пересчитать и вы на них едва ли наткнетесь. Цитата: преподаватель с сайта ITVDN.com рассуждал о goto и очень яростно утверждал, что надо читать какие-то две книги, чтобы понимать, как его использовать Случаи где goto к месту, то есть улучшает читаемость, быстродействие или объем, существуют, но их всего несколько. Единственный случай, который мне вспоминается — выход из нескольких вложенных циклов. Однако лично мне его использовать не пришлось ни разу. Цитата: Про общепринятые стандарты называния переменных … писать без пробелов Ну, без пробелов — особенности компиляторов. Рекомендации по стилю это всего лишь рекомендации, стандартов куча и все разные. |
||
Вернуться наверх | |||
Мikа
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 17:51:41 |
||
Карма: 4 Рейтинг сообщения: 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 Если в Encoder.h заменить строки Код: #ifndef EncoderMacro //имя макроопределения может быть любым. Для простоты можно использовать имя файла На такие Код: #ifndef Encoder //имя макроопределения может быть любым. Для простоты можно использовать имя файла То получаются такие ошибки: Severity Code Description Project File Line Двойной клик по первой приводит сюда: Код: EncoderExt.c #include <avr/io.h> void Encoder(void) // <— Курсор становится в эту строку между ( и void Двойной клик по второй ошибке приводит сюда: Код: EncoderExt.h #ifndef Encoder //имя макроопределения может быть любым. Для простоты можно использовать имя файла Судя по весему в первом варианте не правильно называю макроопределение и программа вообще не видит ничего. |
||
Вернуться наверх | |||
COKPOWEHEU
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Сб апр 02, 2016 20:13:00 |
||
Карма: 8 Рейтинг сообщения: 0
|
Цитата: Если вы в симуляторе смотрите Си программу и вас интересует заход программы в обработчик прерывания — следите не за тем, куда программа шагает а за переменными в обработчике. Отключите оптимизацию (флаг -O0). У меня в AVRStudio 4.18, да и протеусе нормально заходил в обработчик прерывания. Цитата: 3. Добавляю файлы в проект (см. скриншот) Насчет добавления в раздел library не уверен, может так и надо, хотя выглядит странно. Добавлять туда *.h-файл не нужно, он там будет только мешать. Цитата: #ifndef Encoder Опять ходите по тем же граблям. Определяете одно и то же имя несколькими разными способами. В примере я не зря так над ним извращался — добавлял подчеркивания и капс — чтобы минимизировать шанс что такой набор символов случайно попадется где-то еще. Цитата: 5.1 Если оставить все, как описано выше, получаются следующие ошибки: Эти переменные не объявлены в файле EncoderExt.c. Каждый *.c файл компилируется независимо от остальных, поэтому используемые функции и переменные должны быть объявлены хотя бы только прототипами. В вашем случае стоит сделать так: Код: signed char encoder_sum = 0; //или как оно у вас объявлено А в заголовочном файле (*.h) надо добавить объявление переменной encoder_sum: Код: extern signed char encoder_sum; Что с koefficient’ом решайте сами, нужен ли он и какую роль исполняет. Код: void set_encoder_sum(signed char sum); А в файле исходного кода (*.c) описываем реализацию Код: void set_encoder_sum(signed char sum){encoder_sum = sum;} Это несколько ухудшит производительность, зато несколько безопаснее. Труднее изменить эту переменную случайно, а если это не нужно, функцию set_encoder_sum() можно вообще убрать. Кстати, прошу прощения за функции-в-одну-строчку, но если они выполняют одно действие, читаемость не ухудшается. |
||
Вернуться наверх | |||
L.O.D
|
Заголовок сообщения: Re: Помогите понять, что творит оптимизатор Си AVR Добавлено: Вс апр 03, 2016 03:33:18 |
Карма: 4 Рейтинг сообщения: 0
|
COKPOWEHEU писал(а): На счет разделения на несколько файлов L.O.D. недостаточно подробно расписал. Прошу прощения, но мое описание совпадает с Вашим, с точностью до имен переменных или файлов. Мikа писал(а): получаются следующие ошибки: Undeclared — необъявленные. А ведь я писал ранее: L.O.D писал(а): 1. Добавить в проект новый .c-файл, написать в его начале соответствующий #include «…» Правда, в дальнейшем придется несколько нарастить сложность таких объявлений, но об этом позже — от простого к сложному. |
Вернуться наверх | |
Кто сейчас на форуме |
Сейчас этот форум просматривают: Google [Bot] и гости: 6 |
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |