Перейти к содержанию

Вопросы По Coocox Coide


mr_smit

Рекомендуемые сообщения

Добрый день. Использую отладочную плату discovery. Подключил по SPI дисплей от Siemens S65. Всё работает, но не могу понять как работать со sprintf в CooCox ??? В чистом виде не компилируется. Показывает не понятные ошибки привязанные к ядру. Погуглил, нашел: http://www.coocox.or...ae-001d7d723e56

Кокосовцы в курсе и предлагают прикрепить к проекту доп. файлик. Прикрепил. Всё стало компилироваться. Но sprintf не работает. Может кто прояснит ситуацию.

char convert[32];
float temp = 23.9;
...
put_string(50,22,"ТЕМПЕРАТУРА",0x0000,2);

sprintf(convert,"%.1f",temp);
put_string(50,50,convert,0x0000,2);

Слово "температура" выводится, а само значение нет.

Посмотрел их измененный файл. У них там написано:

signed int sprintf(char *pStr, const char *pFormat, ...)

Что значит троеточие??? И где форматирование точка с запятой ' f ' ?

/* Parse type */
switch (*pFormat) {
case 'd':
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
default:
return EOF;
}

Думал modf использовать, но эта функция всё равно дробную часть в виде точки с запятой выдает. Умножение на 10 не помогает. Как тогда число с плавающей точкой перевести в строку то? :wall:

Ссылка на комментарий
Поделиться на другие сайты

Попробуйте так:

sprintf(convert,"%f",temp);

Троеточия подразумевают бесконечное число параметров. Т.е. можно не только одну но и более переменных выводить одной командой в один буфер, кроме вывод тут можно сделать сразу всего, например sprintf(convert,"Температура = %f",temp);

* так работает в классическом Си, не знаю как с микроконтроллерами.

** судя по тому, что f не прописан, оно скорее всего и не заработает

Изменено пользователем tcoder
Ссылка на комментарий
Поделиться на другие сайты

Попробуйте так:

sprintf(convert,"%f",temp);

** судя по тому, что f не прописан, оно скорее всего и не заработает

Так оно и не работает. Я пробовал. Дурдом какой то :(

Изменено пользователем mr_smit
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А если разбить float на два целых числа и вывести их через точку ?

Можно и так (кстати как?). Но всё же почему нет стандартной функции :(

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Может кто знает лучший вариант... я делал так:

float pi = 3.14;
int pi_int = pi; //здесь будет целая часть - 3
int pi_float = ((pi*100)-(pi_int*100)); //здесь будет дробная часть - 14

Если в дробной части нужна точность до тысячных, то ((pi*1000)-(pi_int*1000)) и т.д...

Далее просто выводим pi_int и pi_float через точку и получим 3.14

Изменено пользователем TDSS

Иван Сусанин - первый полупроводник

Ссылка на комментарий
Поделиться на другие сайты

Служба поддержки кокоса молчит. Так жаль. Мне понравился этот компилятор. А ля кодевижн для Мег.

Изменено пользователем mr_smit
Ссылка на комментарий
Поделиться на другие сайты

Я вообще не понимаю что за `_sbrk_r' `_lseek' `_kill' `__exidx_start' ему нужны

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-sbrkr.o): In function `_sbrk_r':

[cc] writer.c:(.text+0x10): undefined reference to `_write'

[cc] sbrkr.c:(.text+0xc): undefined reference to `_sbrk'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-writer.o): In function `_write_r':

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-closer.o): In function `_close_r':

[cc] closer.c:(.text+0xc): undefined reference to `_close'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-lseekr.o): In function `_lseek_r':

[cc] lseekr.c:(.text+0x10): undefined reference to `_lseek'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-readr.o): In function `_read_r':

[cc] readr.c:(.text+0x10): undefined reference to `_read'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/armv7-m\libgcc.a(unwind-arm.o): In function `get_eit_entry':

[cc] unwind-arm.c:(.text+0x144): undefined reference to `__exidx_start'

[cc] unwind-arm.c:(.text+0x148): undefined reference to `__exidx_end'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-abort.o): In function `abort':

[cc] abort.c:(.text+0xa): undefined reference to `_exit'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_kill_r':

[cc] signalr.c:(.text+0xe): undefined reference to `_kill'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_getpid_r':

[cc] signalr.c:(.text+0x28): undefined reference to `_getpid'

[cc] collect2: ld returned 1 exit status

BUILD FAILED

Total time: 1 second

Ссылка на комментарий
Поделиться на другие сайты

Ответ с кокосового форума:

//do the following:


float float1;
snprintf(buf, sizeof(buf), "blablabla %d.%d", (int8_t) float1, (((int16_t)(float1 * 10.0)) % 10));

Изменено пользователем mr_smit
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

При отладке проекта в CoIDE 1.6.0 в вкладке Variables, переменные выводятся по умолчанию в DEC формате, каждый раз приходится переключать на HEX. Нигде не могу найти настройки, чтобы все время выводилось по умолчанию в шестнадцатеричном формате.

Ссылка на комментарий
Поделиться на другие сайты

  • 11 месяцев спустя...

Здравствуйте. Все наверно сталкивались с возможностью автозамены кода. (К примеру вывод конструкции if-else когда начинаешь набирать if). Но вид в котором выстраиваются скобки совершенно не устраивает. Может кто знает, где это можно изменить?

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

Добрый день. Использую отладочную плату discovery. Подключил по SPI дисплей от Siemens S65. Всё работает, но не могу понять как работать со sprintf в CooCox ??? В чистом виде не компилируется. Показывает не понятные ошибки привязанные к ядру. Погуглил, нашел: http://www.coocox.or...ae-001d7d723e56

Кокосовцы в курсе и предлагают прикрепить к проекту доп. файлик. Прикрепил. Всё стало компилироваться. Но sprintf не работает. Может кто прояснит ситуацию.

char convert[32];
float temp = 23.9;
...
put_string(50,22,"ТЕМПЕРАТУРА",0x0000,2);

sprintf(convert,"%.1f",temp);
put_string(50,50,convert,0x0000,2);

Слово "температура" выводится, а само значение нет.

Посмотрел их измененный файл. У них там написано:

signed int sprintf(char *pStr, const char *pFormat, ...)

Что значит троеточие??? И где форматирование точка с запятой ' f ' ?

/* Parse type */
switch (*pFormat) {
case 'd':
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
default:
return EOF;
}

Думал modf использовать, но эта функция всё равно дробную часть в виде точки с запятой выдает. Умножение на 10 не помогает. Как тогда число с плавающей точкой перевести в строку то? :wall:

У меня тоже сейчас похожая проблема. Ссылка, что ты прикрепил ведёт на несуществующую станицу. Можешь рассказать, что за файлик, и как его подключить?

Ссылка на комментарий
Поделиться на другие сайты

Можешь рассказать, что за файлик, и как его подключить?

На стартовой странице кокоса где галочками выбираются используемые библиотеки надо поставить глочку "retarget printf". Сейчас вроде поправили эту библиотеку и всё работает корректно.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

я подключил так

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

а потом сделал так

void PrintTarget(uint32_t Value, char *End)
{
char str_buf_V[8];
char str_buf[8];

sprintf(str_buf_V, "%04u%s", Value, End);
str_buf[0] = str_buf_V[0];
str_buf[1] = str_buf_V[1];
str_buf[2] = 0x2E;
str_buf[3] = str_buf_V[2];
str_buf[4] = str_buf_V[3];
str_buf[5] = str_buf_V[4];
str_buf[6] = str_buf_V[5];
MT_WH1602_SetDDRAMAddress(0x0A);
while (MT_WH1602_ReadBusy()!=FALSE);
lcd_write_str(str_buf);
}

в реализации тупо, но на деле работает )

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

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

когда я почитал реализацию sprintf, то понял, что лучше вручную

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Всем привет. Нахожусь на стадии изучения этого камня параллельно языка C, возникают вопросы на которые ищу ответ среди вас.

Решил включить диодики на плате STM32VLDISCOVERY c STM32F100RB.

void main()
{
 //Enable port C clocking
 *(unsigned long*)(0x40021018) |= 0x10;
 /*0x40021000 - адрес регистра AHB, 0x018 - добавка для APB2, 0x10 значение для IOPCEN
 */
 //little delay for GPIOC get ready
 volatile unsigned long i=0;
 i++; i++; i++;
 i=0;
 //режим работы C 8
 *(unsigned long*)(0x40011004) |= 0x10;
 /* 0x40011000 адрес GPIOC , 0x04 - адрес CRH , 0x10 - значение для 8 пина пуш-пул, 2 МГц
 */
 //Turn LED ON!
 *(unsigned long*)(0x40011010) = 0x100;
 /* 0x40011000 адрес GPIOC , 0x10 - адрес BSRR, 0x100 - значение для 8 пина
 */
 while(1);
}

К сожалению диоды не горят. Все мои попытки как-то запустить сей процесс не помогли.

Есть ли здесь ошибка?

Информацию брал с сайта STM, и хабра .

Этот камень для меня первый.

Буду благодарен за вашу помощь.

Ссылка на комментарий
Поделиться на другие сайты

вот ты извращенец

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

GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
// GPIO A
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO B
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO C
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);

и так далее. Ошибки конфигурации исключаются автоматически. И не слушай никого, кто говорить что инициализация структурами это бред и говно и некрасиво. Зато оно всегда работает правильно и это свойство превешивает 100500 любых аргументов против

лучше сразу привыкнуть к нормальной записи и ей пользоваться. Тем более в кокосе великолепнейшая справка по всем функциям и библиотекам со встроенными примерами

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

mail_robot, спасибо за ответ.

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

К сожалению, смотря в библиотеки к стмке, я так и непонял как они, там, работают, поэтому пришлось заниматься сочинительством.

Буду рад участию всех кто понял эту вундервафлю.

Изменено пользователем atrel
Ссылка на комментарий
Поделиться на другие сайты

в стм НЕ надо через регистры. Это совсем другой класс процессора. И адреса в нем знать совершенно не обязательно. Модель программирования отличается от AVR и PIC. Там ресурсов немного, регистры - по пальцам. А тут их просто море, на каждый чих по флагу, на каждый пук свой регистр. На каждое действие куча перекрестных взаимодействий. Если вы будете продолжать в том же духе, думаю знакомство с стм будет весьма мрачным

И кстати не стоит шибко экономить ресурсы и ужимать код. Тут это уже не требуется. Нет, соблюдать правила писанины конечно надо, но не настолько жестко. Производительности по сравнению с 8-битками просто пипец как много...

В целом понять нужно немного.

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

2. В СТМ все просто, не надо усложнять наследием прошлого.

3. Все надо писать понятным языком библиотеки CMSIS

4. Писать лучше на С++. Процедурный код уже не пойдет на такие обьемы. Поэтому начать лучше с кокоса, но потом все равно пересаживаться на Keil

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Вам Не надо. А Мне Интерестно!

Поэтому я и ищу соучастников.

К стати, работаю я в кокосе. Может он неможет так? (ошибок при компиляции не выдаёт).

Изменено пользователем atrel
Ссылка на комментарий
Поделиться на другие сайты

Короче, работает так

void main()
{
 //Enable port C clocking
 *(unsigned long*)(0x40021018) |= 0x10;
 /*0x40021000 - адрес регистра AHB, 0x018 - добавка для APB2, 0x10 значение для IOPCEN
 */
 //little delay for GPIOC get ready
 volatile unsigned long i=0;
 i++; i++; i++;
 i=0;
 //режим работы C 8
  *(unsigned long*)(0x40011004) = 0x02;
 /* 0x40011000 адрес GPIOC , 0x04 - адрес CRH , 0x10 - значение для 8 пина пуш-пул, 2 МГц
 */
 //Turn LED ON!
  //*(unsigned long*)(0x4001100c) = 0xffff;
  *(unsigned long*)(0x40011010) = 0x100;
 /* 0x40011000 адрес GPIOC , 0x10 - адрес BSRR, 0x100 - значение для 8 пина
 */
 while(1);
}

Всё дело было в неправильном значении в CRH и просто = вместо |=.

Ссылка на комментарий
Поделиться на другие сайты

Теперь, вопрос стоит об атомарных операциях.

1. Как их делать?

2. Их преимущество?

3. Почему во многих источниках говорится об группах битов, а не единицах?

Всегда рад Вашему участию.

Ссылка на комментарий
Поделиться на другие сайты

почитайте на тему битовых массивов. Там достаточно много инструментов описано. Но честно говоря смысла в этом не много. Экономии на грош, а потери времени на кодинг существенные. Тем более что С++11 вроде как умеет это дело автоматически оптимизировать даже если и не объявлять битовых структур (по непроверенным слухам). GCC таким свойством не владеет, но зато более толерантен к другим моментам, поэтому код из GCC далеко не всегда прямо переносится на С++11

В остальном битовые операции те же самые что и в восьмибитках (если речь идет о битовом доступе к регистрам и переменным). Синтаксис языка тот же самый

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...