2022年4月25日月曜日

PICのポートアクセスの仕組みをヘッダーから見る

かなり昔の事、PIC12F509というちっこいのを昔使ったことがあって、

最近はどうなの?と思って開発環境を入れてみた

まず、IDE

ここからインストール

https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide

次にコンパイラが入ってないのでコンパイラのインストール

https://www.microchip.com/en-us/tools-resources/develop/mplab-xc-compilers#tabs

んで、MPLAB X IDEを開き

FileからNew Project


Nextを押してPIC12F509を選択


デバッガは無いのでこのままNext

コンパイラを選択してNext

プロジェクト名を入れてFinish

Source Filesで、メインを作ってみる(main.cを選択)

すると、こんなメインが出来上がる

#include <xc.h>

void main(void) {
    return;
}


ポートについて調べようと、Classesタブを見てみると、
Librariesの下にGPIObitsがあったので、中身を見てみた。


ちなみに、データシートによると、GPIOは06h割り当てられている。

さきほどのGPIObits_tを選択すると、pic12f509.hのヘッダが開くのだが、

そこに以下のように書かれてる。

typedef union {
    struct {
        unsigned GP0                    :1;
        unsigned GP1                    :1;
        unsigned GP2                    :1;
        unsigned GP3                    :1;
        unsigned GP4                    :1;
        unsigned GP5                    :1;
    };
} GPIObits_t;
extern volatile GPIObits_t GPIObits __at(0x006);

構造体でビットが定義してあって、GPIObits.GP0=1;とかやればいいんだなってのが分かる

#include <xc.h>

void main(void) {
    GPIObits.GP0 = 1;
    return;
}




2022年4月24日日曜日

BisonとFlexで四則演算(カッコ未実装)

よくある、BisonとFlexを使った四則演算

カッコはまだ実装してない

しかも、抽象構文木も作ってないし、ABSの実装も適当

ただ、優先度つけてるだけ


mycalc.y

%{
#include<stdio.h>
%}

%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL

%%

calclist:
    | calclist exp EOL {printf("= %d\n", $2); }
;

exp: factor
    | exp ADD factor { $$ = $1 + $3; }
    | exp SUB factor { $$ = $1 - $3; }
;

factor: term
    | factor MUL term { $$ = $1 * $3; }
    | factor DIV term { $$ = $1 / $3; }
;

term : NUMBER
    | ABS term { $$ = $2 >= 0 ? $2 : - $2; }
;

%%

int main (int argc, char** argv)
{
    yyparse();
    return 0;
}

yyerror(char *s)
{
    fprintf(stderr, "error: %s\n", s);
}

んで、これをBisonにかける

bison -d mycalc.y

mycalc.tab.hが出来るので、中身を見ると以下の記述が出来ている。

/* Token type.  */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
  enum yytokentype
  {
    NUMBER = 258,
    ADD = 259,
    SUB = 260,
    MUL = 261,
    DIV = 262,
    ABS = 263,
    EOL = 264
  };
#endif

%tokenから定義が作られる。

つぎに字句解析部

mycalc.l

%{
#include "mycalc.tab.h"
int yylval;
%}

%%
"+" { return ADD;}
"-" { return SUB;}
"*" { return MUL;}
"/" { return DIV;}
"|" { return ABS;}
[0-9]+ { yylval = atoi(yytext); return NUMBER;}
\n { return EOL;}
[ \t] {}
. {printf("Mystery character %c\n", *yytext);}

%%

さきほどbisonが吐き出したmycalc.tab.hをincludeして、

ADDやSUBなどを返すのが主な仕事

値はyylvalに入れて、NUMBERを返すようになっている。

こっちにはmain関数は無い

flexでlex.yy.cを作る

flex mycalc.l


んで、lex.yy.cを見てみると、すげー長いコードが出来ていて、

こんな字句解析要る?ってみんな思うし、

自分で作ったほうがよくね?と話題になったりする。


最後にまとめる

 cc -o mycalc XQParser.tab.c lex.yy.c -lfl


./mycalc

1+2

= 3

3+3

= 6

1+2+3*4/2

= 9

まぁ一応動くのが出来る。


ここまで、Bison And Flexのコードなんだけど、

ABS動かないよね、なんじゃこれ状態?