понедельник, 14 января 2013 г.

scmRTOS и AVR Studio 6

Недавно у меня возникло желание освоить какую-нибудь операционную систему для МК семейства AVR. В качестве ОС была выбрана операционная система реального времени scmRTOS. В интернете была найдена инструкция по прикручиванию данной ОС к студии. Следуя ей, я добился (сразу почему-то не пошло) того, что проект начал компилироваться. Однако, при симуляции в протеусе стало ясно, что ОС не работает. Точнее говоря, не работал диспетчер задач - все время выполнялся самый приоритетный процесс.
Поискав в интернете наткнулся на сообщения, в которых говорится, что ОС не корректно компилируется новыми компиляторами для MSP430. Возможно, это наш случай.
После скачивания 4-й студии и сборки в ней проекта все заработало.
Для того чтобы все работало и в текущей (6-й) студии Вам необходимо скачать WinAVR и установить его. Дальше в студии во вкладке Tools->Options->Toolchain прописать адреса к новому (на самом деле старому) тулчейну (WinAVR). После этого в свойствах проекта во вкладке Advanced выбрать вновь созданный тулчейн. Все должно работать.

суббота, 8 октября 2011 г.

Suspend/Hibernate в ноутбуках Asus под Ubuntu Linux

После приобретения ноутбука Asus K53E и установки на него ОС Ubuntu напрочь отказывался работать Suspend/Hibernate. Ноут просто зависал. Решение было найдено здесь. Ниже приведена последовательность действий, которая нормализует работу Suspend/Hibernate.

1. Необходимо создать файл 20_custom-ehci_hcd

sudo touch /etc/pm/sleep.d/20_custom-ehci_hcd 


2. Содержимое файла должно быть следующим:
#!/bin/sh

VERSION=1.1
DEV_LIST=/tmp/usb-dev-list
DRIVERS_DIR=/sys/bus/pci/drivers
DRIVERS="ehci xhci" # ehci_hcd, xhci_hcd
HEX="[[:xdigit:]]"
MAX_BIND_ATTEMPTS=2
BIND_WAIT=0.1

unbindDev() {
  echo -n > $DEV_LIST 2>/dev/null
  for driver in $DRIVERS; do
    DDIR=$DRIVERS_DIR/${driver}_hcd
    for dev in `ls $DDIR 2>/dev/null | egrep "^$HEX+:$HEX+:$HEX"`; do
      echo -n "$dev" > $DDIR/unbind
      echo "$driver $dev" >> $DEV_LIST
    done
  done
}

bindDev() {
  if [ -s $DEV_LIST ]; then
    while read driver dev; do
      DDIR=$DRIVERS_DIR/${driver}_hcd
      while [ $((MAX_BIND_ATTEMPTS)) -gt 0 ]; do
          echo -n "$dev" > $DDIR/bind
          if [ ! -L "$DDIR/$dev" ]; then
            sleep $BIND_WAIT
          else
            break
          fi
          MAX_BIND_ATTEMPTS=$((MAX_BIND_ATTEMPTS-1))
      done  
    done < $DEV_LIST
  fi
  rm $DEV_LIST 2>/dev/null
}

case "$1" in
  hibernate|suspend) unbindDev;;
  resume|thaw)       bindDev;;
esac


3. Добавим права на исполнение для данного файла

sudo chmod 755 /etc/pm/sleep.d/20_custom-ehci_hcd 


Теперь можно закрывать крышку, Suspend/Hibernate должны работать

среда, 7 октября 2009 г.

Погода в conky. Пишем скрипт

Про conky, наверное, знает знает каждый. Это один из самых популярных системных мониторов, отбражающих информацю на рабочий стол. Многие помимо информации о системе хоте ли бы видеть на рабачем столе и погоду, однако, когда я столкнулся с подобной задачей, то не смог ее решить: то готовый скрипт не работал, то на сервере, к которому он обращался, не было информации о моем городе. Что ж, не беда на пишем свой скрипт.

Писать будем на Python 2.6. В качестве ланных будум использовать те, что предоставляет http://informer.gismeteo.ru. Данный сервис умеет выдовать погоду в формате XML, чем мы и воспользуемся. По умолчанию скрипт отображает в файл только текущую погоду, но данные имеет обо всей погоде на день. У меня он вызывается cron'ом раз в час и сохраняет все данные в файл, который уже смотрит conky



#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import xml.dom.minidom
import urllib

addr = 'http://informer.gismeteo.ru/xml/28411_1.xml'
param = ['TEMPERATURE', 'PRESSURE', 'WIND']
file = '/home/kirill/.conky/GetWeath/weather'

class weathClass(list):
    def __init__(self, lst): # [temp, press, wind]
        self.temp = lst[0] # title
        self.press = lst[1] # link
        self.wind = lst[2] # date

class Parser():
    def __init__(self, xml_str):
        self.doc = xml.dom.minidom.parseString(xml_str)

    def parse(self):
        weath = []
        items = self.doc.getElementsByTagName('FORECAST')
        for i in items:
            max_val = map(lambda p: i.getElementsByTagName(p)[0].
                getAttribute('max'), param)
            min_val = map(lambda p: i.getElementsByTagName(p)[0]
                getAttribute('min'), param)
            weath.append(weathClass(zip(max_val, min_val)))
        return weath

class Application():
    def __init__(self):
        parser = Parser(self.load(addr))
        self.save(self.format(parser.parse()))

    def format(self, weath):
        st = 'Погода в Ижевске: ' 
        st = st.decode('UTF-8') + weath[0].temp[1] + 
            ' .. ' + weath[0].temp[0] + ' C\n'
        st = st + 'Давление: '.decode('UTF-8') + 
            weath[0].press[1] + ' .. ' + weath[0].press[0] 
            + 'мм рт.ст.\n'.decode('UTF-8')
        st = st + 'Ветер: '.decode('UTF-8') + weath[0].wind[1] 
            + ' .. ' + weath[0].wind[0] + ' м/с'.decode('UTF-8')
        return st
  
    def load(self, url):
        up = urllib.urlopen(url)
        return up.read()

    def save(self, st):
        fp = open(file, 'w')
        fp.write(st.encode('UTF-8'))
        fp.close()

App = Application()

вторник, 29 сентября 2009 г.

SSHD. Логи в отдельном файле

По умолчанию sshd ведет лог в файл /var/log/auth.log, а там у нас куча всего. Чтоб все было по феншую необходимо, чтобы sshd писал лог в свой отдельный файл, например в /var/log/sshd.log. Посмотрим как это можно сделать. В моем Archlinux'е по умолчанию для логов используется программа syslog-ng, значит ее и будем использовать. Конфигурационный файл /etc/syslog-ng.conf имеет следующий вид:



options {
        опции
};

source имя {
        описание источника
};

destination имя { параметры };
filter имя { параметры };
log { source(имя_источника); filter(имя_фильтра); 
destination(имя_направления); };

Описание опций источника мы рассматривать не будем, а обратим наше внимание на разделы destination, filter и log. destination определяет то, куда будет выводится лог: файл, терминал, сокет или сеть. Нас интересует файл, следовательно указываем fail("/var/log/sshd.log") filter определяет признак по которому будет отбираться логируемое сообщение, мы используем program, program{"sshd"). log служит для связывания filter и destination


Итак, нас интересуют три элемента: destination, filter и log. добавляем в /etc/syslog-ng.conf следующие строки:


destination d_sshd { file("/var/log/sshd.log"); };
filter f_sshd { program("sshd"); };
log { source(src); filter(f_sshd); destination(d_sshd); }


Сохраняемся и перезапускаем syslogd-ng, в моем случае:


[root@moon ~]# /etc/rc.d/syslog-ng restart

После сих магических манипуляций sshd начнет выводить логи в определенный нами файл, что существенно упрощает их анализ)


P.S. Аналогичным образом можно управлять логами любой другой программы, которая использует для ведения логово syslog