Как стать автором
Обновить
32
0
Алексей @Alyoshka1976

Пользователь

Отправить сообщение

"плюсик" за STM8S
Мигалка по таймеру с ожиданием прерывания:


source code
#include <stdint.h>
#include <stdio.h>

#define CLK_DIVR    (*(volatile uint8_t *)0x50c6)
#define CLK_PCKENR1    (*(volatile uint8_t *)0x50c7)

#define     __IO    volatile

typedef struct GPIO_struct
{
  __IO uint8_t ODR;
  __IO uint8_t IDR;
  __IO uint8_t DDR;
  __IO uint8_t CR1;
  __IO uint8_t CR2;
}
GPIO_TypeDef;

#define GPIOB_BaseAddress       0x5005
#define GPIOB ((GPIO_TypeDef *) GPIOB_BaseAddress)

#define TIM1_CR1    (*(volatile uint8_t *)0x5250)
#define TIM1_IER    (*(volatile uint8_t *)0x5254)
#define TIM1_SR1    (*(volatile uint8_t *)0x5255)
#define TIM1_CNTRH    (*(volatile uint8_t *)0x525E)
#define TIM1_CNTRL    (*(volatile uint8_t *)0x525F)
#define TIM1_PSCRH    (*(volatile uint8_t *)0x5260)
#define TIM1_PSCRL    (*(volatile uint8_t *)0x5261)

volatile uint8_t led = 0;

void TIM1_overflow_Handler() __interrupt(11)
{
     TIM1_SR1 &= ~1;
     if (led == 1) {
        GPIOB->ODR |= (1 << 5);
     }
     else
     {
        GPIOB->ODR &= ~(1 << 5);  
     }
     led  ^= 1;
}

void main(void)
{
    CLK_DIVR = 0x00;
    CLK_PCKENR1 = 0xFF;

    GPIOB->DDR |= (1 << 5);
    GPIOB->ODR |= (1 << 5);

    TIM1_PSCRH = 0x00;
    TIM1_PSCRL = 0xF4;
    TIM1_CR1 = 0x01;
    TIM1_IER = 0x01;
    __asm__ ("rim");
    while(1)
    {
        __asm__ ("WFI");
    }
}

SW — SDCC + stm8flash
HW — STM8S103F3P6 + ST-LINK V2
240 байт флэша:
image

Сначало было решено назвать поле вот так:
protected $db;


Но в Google пример для соединения написан вот так:
$dbh = new PDO ($dsn, $username, $password); // Попытка подключиться к базе


Вот же незадача :-)

По поводу армейского использования:
image

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


I fly RC drones myself and have tested how my hexacopter behaves during a motor failure. The conclusion I came to is that if it was close to its carrying capacity it would rotate since it needs all the power it has and can't worry about rotation. But if it only carried a light load it woulden't rotate as it has power left over to compensate for it.

Причем дроны чаще всего с фиксированным шагом винта, что не способствует авторотации. Вот интересная дискуссия по этому поводу https://aviation.stackexchange.com/questions/37360/can-a-passenger-drone-perform-auto-rotation

Немножко юмора:
image

Или в MQTT-топики публиковать — питоновский MQTT-клиент paho весьма функционален (по крайней мере, в десктопном варианте — хотя в нем и нет в отличие от Java setAutoReconnect).
А для просмотра в MQTT-клиенте можно настроить интерфейс по своему желанию, начиная с такого спартанского варианта:
image
Недостаток — потребуется использовать стороннего брокера или развернуть свой "москито", что удобнее — на VPS.

Возможно, будет интересно — https://www.conwaylife.com/wiki/Main_Page — 2162 статьи, связанных с творением Конвея.

Был и для Windows 95 (первым его тестом у меня было исполнение креатива ПЛ о лодочнике :-)
Но, конечно, в те времена в корпусе стоял настоящий динамик, а не пьезопищалка.
Вот что MS пишет по поводу такого драйвера — https://support.microsoft.com/ru-ru/help/138857

Забавно, что SBI/CBI таки не всегда быстрее, хотя и компактнее.

P.S. Оптимизатор не всегда придерживается требуемой стратегии s
(хотя конечно gnu.org дает уклончивый ответ — "except those that often increase code size" :-)


PORTD |= 0x03;

дешевле (по размеру) было бы заменить (4 байта, 4 цикла)


sbi    0x0b, 0
sbi    0x0b, 1

а не: (6 байтов, но 3 цикла)


in    r24, 0x0b
ori    r24, 0x03
out    0x0b, r24 

Жаль не могу сейчас найти источник — на одной из англоязычных конференций товарищ с юмором рассказывал о своих коллегах-программистах, искренне не понимающих, как сделать цикл с помощью условного оператора и оператора безусловного перехода.

Как показала проверка, фантазии компилятору не занимать :-) — в одном случае он использует доступ к портам через общее адресное пространство (смещение на 0x20), а в другом — как к порта ввода-вывода.

))))))) Мой результат на 9 минут раньше.

Так и есть при включенной оптимизации (результаты моей проверки):


PORTD = 0x01;

-O0


  ae:    8b e2           ldi    r24, 0x2B    ; 43
  b0:    90 e0           ldi    r25, 0x00    ; 0
  b2:    21 e0           ldi    r18, 0x01    ; 1
  b4:    fc 01           movw    r30, r24
  b6:    20 83           st    Z, r18

Скрытый текст

-Os


  a6:    81 e0           ldi    r24, 0x01    ; 1
  a8:    8b b9           out    0x0b, r24    ; 11

PORTD |= 0x03;

-O0


  ae:    8b e2           ldi    r24, 0x2B    ; 43
  b0:    90 e0           ldi    r25, 0x00    ; 0
  b2:    2b e2           ldi    r18, 0x2B    ; 43
  b4:    30 e0           ldi    r19, 0x00    ; 0
  b6:    f9 01           movw    r30, r18
  b8:    20 81           ld    r18, Z
  ba:    23 60           ori    r18, 0x03    ; 3
  bc:    fc 01           movw    r30, r24
  be:    20 83           st    Z, r18

-Os


  a6:    8b b1           in    r24, 0x0b    ; 11
  a8:    83 60           ori    r24, 0x03    ; 3
  aa:    8b b9           out    0x0b, r24    ; 11

PORTD |= 0x01;

-O0


  ae:    8b e2           ldi    r24, 0x2B    ; 43
  b0:    90 e0           ldi    r25, 0x00    ; 0
  b2:    2b e2           ldi    r18, 0x2B    ; 43
  b4:    30 e0           ldi    r19, 0x00    ; 0
  b6:    f9 01           movw    r30, r18
  b8:    20 81           ld    r18, Z
  ba:    21 60           ori    r18, 0x01    ; 1
  bc:    fc 01           movw    r30, r24
  be:    20 83           st    Z, r18

-Os


  a6:    58 9a           sbi    0x0b, 0    ; 11

Спасибо, интересно посмотреть, как g++ будет вести себя в этом случае в различных режимах оптимизации.

Нет, не совсем тоже самое.
PORTD |=B00000001 эквивалентно PORTD = PORTD | B00000001, т.е. требуется дополнительная операция.


Это можно проверить, отключив через platform.txt оптимизацию кода:


запись в порт с учетом его состояния


void setup() {
  // put your setup code here, to run once:
  PORTD |= 0x58;
}
void loop() {
  // put your main code here, to run repeatedly:
}

Скетч использует 514 байт (1%) памяти устройства


прямая запись в порт


void setup() {
  // put your setup code here, to run once:
  PORTD = 0x58;
}
void loop() {
  // put your main code here, to run repeatedly:
}

Скетч использует 506 байт (1%) памяти устройства


А sbi и cbi меняют конкретные биты порта, совсем не трогая остальные.

Если Вы выводили в побитном режиме посредством digitalWrite, то конечно, функция весьма медленная из-за множества всяких проверок (да и с режимом обработки прерываний она вольно обращается :-)
Если точно знать, что делать, то можно вот так оформить побитный вывод, который займет считанные машинные циклы (в проекте "нанокомпьютера", откуда этот отрывок, мне была важна именна неприкосновенность прерываний):


void pinWrite(uint8_t pin, uint8_t val) {
  switch (pin) {
    case 3://1 PD3 0x0B
      if (val == 1) {
        asm volatile ("sbi 0x0B, 3 \n"); //HIGH
      }
      else {
        asm volatile ("cbi 0x0B, 3 \n"); //LOW
      }
      break;
    case 4://2 PD4
      if (val == 1) {
        asm volatile ("sbi 0x0B, 4 \n"); //HIGH
      }
      else {
        asm volatile ("cbi 0x0B, 4 \n"); //LOW
      }
      break; 
....

Верно! Нашел интересный документ https://www.pooleyinc.com/pdf/SEW%20Voltages%20of%20the%20World.pdf
Колумбия!!! 150 В — фазное, 260 В — линейное.
image

Информация

В рейтинге
Не участвует
Откуда
Гомель, Гомельская обл., Беларусь
Зарегистрирован
Активность