Страница 169 из 386

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт окт 03, 2013 16:22:31
спящий
ploop писал(а):
Короче подскажите функцию смещения одного бита из числа)
Надо поменять местами 2 бита в числе?
Вот кратко охарактеризовал мою проблемму ,надо 9 бит записать в 15 - как это сделать, чтобы остальное число неменялось)
или точнее надо чтобы 15 бит был такойже как и 9.

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт окт 03, 2013 18:42:11
спящий
Спасибо разобрался) получилось както так:
if(x&256)
x |= (1<<13);
else
x &= ~(1<<13);
if(x&512)
x |= (1<<14);
else
x &= ~(1<<14);

Вот у меня вопрос: можно ли убрать else? я думал одна строчка к if относиться другая к else?

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт окт 03, 2013 19:06:06
ploop
Опять ничего непонятно :)))
Но от else можно избавиться так:

Код: Выделить всё

x = (x&256) ? x |= (1<<13) : x &= ~(1<<13);
x = (x&512) ? x |= (1<<14) : x &= ~(1<<14);
Они абсолютно равнозначны, только ваша запись для некоторых понятнее.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт окт 04, 2013 18:06:20
YS
Короче подскажите функцию смещения одного бита из числа)
Давайте я Вам покажу методику установки отдельных битов в массиве.

Код: Выделить всё


//устанавливает бит с номером N в массиве ARR
#define set_bit_by_number(ARR,N)                ((ARR)[(N) / 8]|=(1<<((N) % 8)))
//очищает бит с номером N в массиве ARR
#define clear_bit_by_number(ARR,N)                ((ARR)[(N) / 8]&=~(1<<((N) % 8)))

...

uint8_t array[10];

...


set_bit_by_number(array,12); //устанавливает двенадцатый бит в массиве; то есть, во втором (12 / 8) байте будет записано 0x10 (пятый бит, 12 % 8)

...

clear_bit_by_number(array,70); //снимает семидесятый бит в массиве; то есть, в восьмом (70 / 8) байте будет снят шестой (70 % 8) бит


Re: Вопросы по С/С++ (СИ)

Добавлено: Сб окт 05, 2013 14:44:07
FeCat
Я правильно понимаю, что если пользоваться «typedef unsigned char u08», то
unsigned char
и
u08
для компилятора всё равно не одно и то же (варнингами ругается на несоответствие типов)?

Re: Вопросы по С/С++ (СИ)

Добавлено: Сб окт 05, 2013 15:16:33
coredumped
правильно понимаете. Это какбэ то же самое, но не одно и то же :)

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс окт 06, 2013 18:16:14
FeCat
Пишу:

Код: Выделить всё

u08 Time[12];

Time[1]='д'; // русская ‘д’
Если это написано в основном цикле программы, то всё нормально.
Если же выношу в функцию на отдельном листе, то компилятор ругается на это:
«Warning 1 multi-character character constant [-Wmultichar]»
«Warning 5 large integer implicitly truncated to unsigned type [-Woverflow]»
В Time[1] попадает мусор, впечатление будто начинает используется какая то другая кодировка.
Atmel Studio 6.1
Я что то делаю не так?

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс окт 06, 2013 19:06:24
coredumped
Проблема в юникоде - русская буква занимает 2 байта. Варианта решения 2: либо включить CP1251 в редакторе (если возможно), либо записывать строки в виде HEX.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн окт 14, 2013 14:10:32
Chip115
Всем привет! У меня один вопрос: "Как уйти от быдлокодинга?"
Надо писать прошивку для контроллера. Пишу на сях. Задействованы два UART, ADC, DAC, PWM (до шести каналов). Проблема в том, что опыта мало. До этого делал всякую мелочь типа термометров, вольтметров и прочей мелочи. Сейчас продумываю структуру программы. Думал заюзать FreeRTOS, но кажется не встанет. У контроллера 16к флешки и 4к срама.
Читал статьи ДиХалта о структуре программ. Решил остановиться идее межзадачного взаимодействия посредством флагового автомата. Естественно всё (в идеале) будет крутиться в прерываниях... . Еще грамотно приоритеты расставить. Но кажется такая структура будет неповоротливая и может рухнуть под собственным весом. Можете посоветовать какую нить статью про структуру программ? Какой структуры придерживаетесь вы, когда работаете над серьёзным проектом?

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн окт 14, 2013 17:08:25
Аlex
Вы не назвали ни контроллер ни компилятор, который юзаете. Трудно что-то посоветовать Вам, не зная этих данных.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн окт 14, 2013 19:09:17
blackx
Chip115 писал(а):Всем привет! У меня один вопрос: "Как уйти от быдлокодинга?"
Если абстрактно, то:

0. Сначала - пишете понятный код - и только потом - оптимизируете (если вообще нужно!!). Не надо переносить в Си стиль написания программ на ассемблере.
1. Пишите понятный код. Если вас разбудить на следующее утро после кодирования, вы должны быть в состоянии ответить что делает случайно взятая строчка из кода. Это значит
а) давайте переменным, функциям и макросам понятные имена
б) если из-за требований получается непонятно, даже после попытки рефакторинга - пишите подробные комментарии
2. Не торопитесь. Делайте программу последовательно, проверяя каждый шаг.
3. Каждая функция должна фокусироваться на строго одной задаче.
4. не забывайте о KISS и DRY.

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

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт окт 15, 2013 00:29:48
BCluster
FreeRTOS замечательная вещь. Используем активно, но на контроллере с 512кб флеш и 32кб рам.
Не зная задачи, трудно говорить о необходимости и адекватности использования ОС. И что будет крутиться в прерываниях? В ОС этого как раз я бы избегал. Если речь не идет о драйверной части. Был бы контроллер пожирнее, я бы рекомендовал С++ для большого проекта. Но если нет опыта, все же нужно начинаться с Си.
Все же, чуть конкретнее о задаче и контроллере, тогда можно будет что-то посоветовать

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт окт 15, 2013 04:46:54
Chip115
Спасибо за ответы! Камень: STM32F100RB; среда разработки: IAR; Язык: С

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт окт 15, 2013 08:14:28
BCluster
В этом МК, если я не ошибаюсь 128кБ флэш и 8кБ ОЗУ. Звучали другие цифры ранее :) На этом МК вполне можно запустить freertos.
PS: А о проекте так и не сказали. Клещами тащить надо ? :)))
Но в общем-то, дело хозяйское

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс окт 20, 2013 05:44:59
Chip115
Доброго времени суток, господа!
Тут такое дело. Хочется заюзать printf для вывода отладочной инфы й UART.
Так вот он работает только с настройками формата printf Tyny, выводя целые числа. Как мне заставить работать printf в формате Full, что бы вывести не целое число?
При других настройках формата выводится только первый символ.
Вот код для отладки отладочной функциональности О_о Замеряю напругу на входе АЦП и хочу вывести величину измеренного напряжения в UART.
Среда разработки IAR 6.40.2
Камень: STM32F100C4T6B

Код: Выделить всё

#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include <stdio.h>

int putchar(int c)
{
    while(( USART1->SR & USART_SR_TXE) == 0);
    if (c == '\n')
      c = '\r';
    USART1->DR = c;
    return 0;
}

void main(void)
{
  Sys_Clock_Config ();
  USART_Config ();
  GPIO_Config ();
  ADC_config ();

  int a = 0;
  double ADC_resoult;
  a = ADC1->DR;
  ADC_resoult = 3.3*a/4095;
  printf ("ADC convert = %f\n", a);
  
  
  while(1) 
  {
   
  }
}
Все. Разобрался. Нашел решение проблемы в статье тут

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс окт 20, 2013 08:48:02
vitalik_1984
вроде текст программы на английском а ADC_resoult это какое то новое слово. Может лучше ADC_result ?

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс окт 20, 2013 09:21:45
oleg110592
И сколько, интересно, printf отгрызла памяти. Если уж double, то может так будет правильнее:
ADC_resoult = 3.3*(double)a/4095.0;

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс окт 20, 2013 09:52:59
blackx
Нашли к чему придраться и сразу накинулись :facepalm:

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс окт 20, 2013 10:21:45
oleg110592
кто ж придирался то. В двух верхних постах присутствует слово "может" - это вводное слово, указывает на вероятность события вероятно, по-видимому. Насчет printf мне интересно, когда то начинал с LPC2101 возиться - применил printf, то отгрызло чуть ли не пол памяти, а как сейчас - может лучше стало. Интересно какой компилятор.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн окт 21, 2013 23:36:03
BCluster
oleg110592 писал(а): применил printf, то отгрызло чуть ли не пол памяти
жрет дофига, 1.5-2кб ОЗУ :)
Так вот он работает только с настройками формата printf Tyny
В настройках проекта в IAR это настраивается

упс тока заметил что уже решили )