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

Keil mVision V5


Smith2007

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

Исследую платку stm32f103c8t6.

В качестве ide - Keil mVision v5.

Проект на Си++

При работе с UART мне требуется вывести некоторую информацию. Делаю это при помощи следующих функций:

void USARTSend(char *ptrOutBuf) {
	while (*ptrOutBuf)
	{
		USART_SendData(USART1, *ptrOutBuf++);
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
	}
}

void USARTSend(int val) {
	int i = 0;
	
	sprintf(buffer, "%x", val);
	while (buffer[i])
	{
		USART_SendData(USART1, buffer[i]);
		i++;
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
	}
}
void USARTSend(const unsigned char *ptrOutBuf)
{
    while (*ptrOutBuf)
    {
        USART_SendData(USART1, *ptrOutBuf++);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        {
        }
    }
}

В некоторых строках вывожу текст следующим вызовом:

USARTSend("\r\nUSART1 is ready.\r\n");

Компилируется без ошибок.

Вывод сообщений в UART тоже без ошибок.

Но в редакторе кода Keil  на против последней записи появляется значок warning!

keil.png.e546dd61ddddb045565765c8c4630be5.png

Код выполняется верно

2018-05-12_01-47-16.png.2c6256fbe0c9a2ecd37b81708d11eb7c.png

 

Как можно избавиться от неприятного предупреждения?

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

50 минут назад, artos5 сказал:

void USARTSend( char *ptrOutBuf)

 

Такая конструкция уже есть. Смотрите выше.

При помощи этой процедуры я вывожу значения переменные из массива char

sprintf(buffer, "zz= %x \r\n", zz);
USARTSend(buffer);

 

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

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

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

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

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

Ну компилятору не нравятся типы данных , это 100%. Попробуй явно указать так (char).

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

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

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

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

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

1 минуту назад, artos5 сказал:

Ну компилятору не нравятся типы данных , это 100%. Попробуй явно указать так (char).

Если указать только 

void USARTSend( char *ptrOutBuf) {
...
}

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

USARTSend("\r\nUSART1 is ready.\r\n");

 

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

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

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

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

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

Щас скину свою функцию передачи по юарт . У меня без ворнингов и ошибок собирается.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Да в кейле тоже писал. Инет тупит , долго скачивается проект из облака.

void PWM_uart2(char *str)
{
    int x=0;
    str+=0;
  while(str[x])
  {
     x++;
    }
if(x) HAL_UART_Transmit(&huart2,(uint8_t*) str,x,1000);
}
 

Тут не применял sizeof() так как пробовал  , через sizeof() не работало , передавало 3 байта вместо нужных .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

27 минут назад, Smith2007 сказал:

C++

Удали часть цитаты , правилами форума запрещено полностью цитировать предыдущий пост.

USART_SendData(USART1,(char*) buffer);

А так пробовал? 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

42 минуты назад, artos5 сказал:

USART_SendData(USART1,(char*) buffer);

Так тоже пробовал.

6 минут назад, hasl сказал:

если вы пытаетесь определить размер массивы

Пытаюсь понять, почему Keil выдает предупреждение о нежелательном преобразовании.

Код компилируется без ошибок и без ворнингов. И исполняется тоже без ошибок.

 

зы. Есть конечно выход. Определить заранее несколько массивов и проинициализировать их этими строками. 

Следующий вызов в редакторе без ворнингов

sprintf(buffer, "zz= %04x \r\n", zz);
USARTSend(buffer);

 

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

Если предупреждения пишутся в консоле - тогда исправляйте

Если они помечены сбоку - забейте

это один из загонов кейла и не последний

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

Даже драйвера HAL не генерятся в с++, программой от ST

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

3 минуты назад, hasl сказал:

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

Спасибо за инфу.

На С++ мне проще перетащить проекты с ардуинки. Да и привычнее как-то.

Больших проектов нет. В 16 кб вмещаются. Поэтому не стесняюсь использовать классы и всякие sprintf, atoil , etc. Когда упрусь в объемы - тогда можно думать. Хотя будет проще МК поменять.

 

А в какой среде нет похожих глюков при использовании С++ ?

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

5 минут назад, MasterElectric сказал:

atollic true studio

Из описания...

TrueSTUDIO Lite, не имеет ограничений по времени пользования и размеру создаваемого кода. Демоверсия включает откомпилированные динамические библиотеки и допускает разработку полноценных приложений. Однако в ней отсутствует поддержка С++

В общем пошел стандартным способом...

Объявил массивы

char strOK[] = "OK\r\n";
char strRst[] = "RST OK\r\n";
char strError[] = "Error\r\n";
char strRstAir[] = "RST AIR OK\r\n";
char strRstFront[] = "RST Front OK\r\n";
char strRstRear[] = "RST Rear OK\r\n";
char strInfo[] = "INFO OK\r\n";


void SendOK(void) {
	USARTSend(strOK);
}


void USARTSend(char *ptrOutBuf) {
	while (*ptrOutBuf)
	{
		USART_SendData(USART1, *ptrOutBuf++);
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
	}
}

И вызовы теперь в Keil без предупреждений

 

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

6 hours ago, Smith2007 said:

В общем пошел стандартным способом...

Выше @MasterElectric сказал, что у вас нет функции void USARTSend(const char *ptrOutBuf), поэтому Кейл и ругается

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

1 час назад, snn_krs сказал:

у вас нет функции void USARTSend(const char *ptrOutBuf), поэтому Кейл и ругается

Но есть аналог: void USARTSend(const unsigned char *ptrOutBuf)

Попробовал привести ее к виду void USARTSend(const char *ptrOutBuf).

Результат идентичен. Кейл предупреждает о нежелательном действии но компилирует без ошибок.

Кстати, на что обратил еще внимание.... 

В тот момент когда я компилировал программу с вызовами типа

USARTSend("\r\nOK\r\n");

Размер кода составил 5005 байт.

Текстовые константы поместил в массивы char и вывел 

char strOK[] = "OK\r\n";
char strRst[] = "RST OK\r\n";
char strError[] = "Error\r\n";
char strRstAir[] = "RST AIR OK\r\n";
char strRstFront[] = "RST Front OK\r\n";
char strRstRear[] = "RST Rear OK\r\n";
char strInfo[] = "INFO OK\r\n";

USARTSend(strOK);

Размер откомпилированного кода составил 4916 байт. 

В компиляторе стоит уровень оптимизации - Level1

С чем это может быть связано?

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

16 minutes ago, Smith2007 said:

Результат идентичен. Кейл предупреждает о нежелательном действии но компилирует без ошибок.

Проверял в Кейле 5.20 результат ниже

Clipboard08.jpg.e753e851936150897eaf7768a41313cf.jpg

18 minutes ago, Smith2007 said:

С чем это может быть связано?

Константы компилятор размещает во флэш, а переменные в ОЗУ

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

2 минуты назад, snn_krs сказал:

могу предположить, что вы забыли объявить новую функцию в *.h файле.

Не забыл

main.h

2018-05-12_12-38-03.png.c6065db689159dd3517f6bf1587f7a95.png

 

зы. А Вы компилируете С++ ?

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

1 hour ago, Smith2007 said:

Текстовые константы поместил в массивы char и вывел 


char strOK[] = "OK\r\n";
char strRst[] = "RST OK\r\n";
char strError[] = "Error\r\n";
char strRstAir[] = "RST AIR OK\r\n";
char strRstFront[] = "RST Front OK\r\n";
char strRstRear[] = "RST Rear OK\r\n";
char strInfo[] = "INFO OK\r\n";

USARTSend(strOK);

Размер откомпилированного кода составил 4916 байт. 

если у вас массивы все равно константы, то неплохо перед ними поставить квалификатор const, это может сэкономить немного места и поддаст скорости на вызовах

ну и С++ в вашем коде я не увидел нигде пока. Обыкновенный С99 )

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

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

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

1 минуту назад, mail_robot сказал:

если у вас массивы все равно константы, то неплохо перед ними поставить квалификатор const

Спасибо. Учту.

1 минуту назад, mail_robot сказал:

ну и С++ в вашем коде я не увидел нигде пока.

В другой части

// Класс кнопка

#ifndef button_h
#define button_h

#include <stdint.h>
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"

class CButton {
public:
	GPIO_TypeDef  GPIOx;
	uint32_t GPIO_Pin;
	bool mode;
	uint32_t countOn;
	uint32_t countHold;
	bool state;    // текущее состояние кнопки
	bool hold;		// 
    bool btOn;     // момент нажатия кнопки
    bool btOff;    // момент отпускания кнопки
	bool btHold;	 // Press long hold
  
  // Нажатие кнопки
  void update(void);

		// Конструктор класса
  CButton(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin, bool mode, uint32_t countOn, uint32_t countHold);

private:
  GPIO_TypeDef *_GPIOx;
  uint32_t _GPIO_Pin;
  uint32_t _countOn; // время задержки антидребезга
  uint32_t _countHold; // время задержки антидребезга
  uint32_t _count;
  bool _mode; // режим работы кнопки, задается при инициализации
                  // -0- если нормально разомкнутая кнопка соеденена с минусом
                  // -1- если нормально разомкнутая кнопка соеденена с плюсом через резистор 1К
  bool _p_state; // предыдущее состояние кнопки
  bool _p_hold;
  bool _p_state_filtr;
  void filtr(void);
  void clickOn(void);
  void clickOff(void);
  void clickHold(void);
};

#endif

 // Создаем кнопку в main
  	CButton bt1(GPIOB, GPIO_Pin_12, true, 2000, 300000);
 

 

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

14 minutes ago, Smith2007 said:

В другой части

это уже похоже ) Не забывайте, что при использовании библиотек на С кое где придется применять директиву extern C {}. А так в целом для STM32 С++ это самый красивый инструмент. И не заморачивайтесь по поводу экономии

18 minutes ago, Smith2007 said:

uint32_t _countOn; // время задержки антидребезга

uint32_t _countHold; // время задержки антидребезга

вот эти вот вещи лучше всего делать константами через #define и вставлять в заголовок. Для всех кнопок они будут идентичными, смысл их каждый раз инитить по всему коду? Тоже сэкономит место и время. И настройка кода упроститься

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

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

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

54 минуты назад, mail_robot сказал:

при использовании библиотек на С кое где придется применять директиву extern C {}

3 дня потребовалось, что бы до меня дошло в чем ошибка

#ifdef __cplusplus
 extern "C" {
#endif
	 
void USART1_IRQHandler(void) {
	if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
		//RX_FLAG_END_LINE = 1;
		//USART_ClearITPendingBit(USART1, USART_IT_RXNE);
		RXc=USART_ReceiveData (USART1);
		RX_BUF[RXi] = RXc;
		RXi++;

		if (RXc != 0x0d) {
			if (RXi > RX_BUF_SIZE-1) {
				clear_RXBuffer();
			}
		} else {
			RX_FLAG_END_LINE = 1; 
		}
		//Echo
		//USART_SendData(USART1, RXc);
	}
}

#ifdef __cplusplus
}
#endif

 

56 минут назад, mail_robot сказал:

в целом для STM32 С++ это самый красивый инструмент

Я не профессиональный программер. И понимание приходит зачастую только после написания десятков разных вариантов процедур. Т.е. через руки :)

Но с С++ мне почему-то проще. И использование "тяжеловесных" библиотек меня на данном этапе ни как не смущает, а напротив даже помогает. Ну и что, что преобразование atoi проигрывает по скорости другим методам (в ручную написанным)? Ну и что, что sprintf тянет за собой несколько Кб кода?

Мои прошивки умещаются в 16Кб. И даже 64Кб флеша на борту макетки f103c8t6 мне с избытком. Если еще учесть, что Keil допускает не более 32Кб. (с фриварной лицензией).

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

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

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

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

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

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

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

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

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

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

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

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