しろうさぎのblog

元ロボカッパー(ジュニアBオープン)でレスコンに参加していました。次はロボカップSSLに参加予定です。気が向いたときにいろいろ書いていきます。

LWIPでPingを有効にする。

どうもしろうさぎです。

LWIPを使う案件があったのですが、通信が確立されているのか簡単にテストする方法としてPingがありますが、デフォルトのままでは、使えません。


そんなことよりもまずはLWIPについて。

lwIP (lightweight IP)は、幅広く使用されているオープンソースのTCP/IPスタックであり、組み込みシステム向けに設計されている。(from Wikipedia)

LwIPを有効にする方法は、STM32Cubeの場合、
キャプチャ
ETHを有効にして、ミドルウェアの欄でLWIPとFreeRTOSにチェックを入れ有効化をします。FreeRTOSを使わずにもできますが、結構めんどくさそうだったのでFreeRTOSにやらせることにします。

静的IPをふる場合DHCPをDisabledにしてIPアドレスやネットマスクやゲートウェイアドレスを記入します。この時オクテットの数字が2桁とか1桁だと先に0を書いて上げないとダメです。あと、UDPを使う場合

#include "udp.h"

を引っ張ってあげないとワーニングが出ることを確認しているのでUDPをたたくソースファイルの頭にでも書いておくことをお勧めします。


前置きはこんなところで、LWIPを使ってPingを有効にする方法は、CubeHALの場合、

#define LWIP_TIMEVAL_PRIVATE 0
/* ping */
#define PING_USE_SOCKETS 1 //1=ping_thread
#define sys_msleep vTaskDelay

ってな感じの記述をしてあげることでPingが有効になります。

実際に、pingを打ってみると帰ってきていることを確認できます。(IPアドレスは192.168.20.101に設定)
キャプチャ

有線のLAN接続ですがレスポンスよく反応してくれます。(LQFP100ピンのものを使ってますが結構発熱しますが・・・・。)

arm_copy_q15で若干はまった話

どうもしろうさぎです。

今度は、arm_copy_q15で配列のコピーを行うときにもともとmemcpyでやっていたのを移植したときにはまったお話をします。

とりあえず、DSPライブラリを使う方法はここを参照のこと。

まずmemcpyについて。参考

void *memcpy(void *buf1, const void *buf2, size_t n);

(引数)
void *buf1 : コピー先のメモリブロック
const void *buf2 : コピー元のメモリブロック
size_t n : コピーバイト数 

次に、arm_copy_q15参考

void arm_copy_q15 ( q15_t * pSrc,q15_t * pDst,uint32_t blockSize )

(引数)
[in] *pSrc points to input vector
[out] *pDst points to output vector
[in] blockSize length of the input vector


お判りでしょうか。簡単に言うとmemcpyとarm_copy_q15のコピー先とコピー元の引数の順番が逆なのです。(これで結構はまった。)

以上です。それではこの辺で。

STM32CubeでFreeRTOSで割り込み処理をする

どうもお久しぶりです。しろうさぎです。

あるプロジェクトでFreeRTOSを利用しているのですが、FreeRTOSで割り込み処理(UARTのDMA受信)をさせようとしたときかなりはまった案件があったので記述しておきます。

FreeRTOSで割り込み処理はRTOS側が勝手にやってくれるのでNVICとか設定をしなくても大丈夫だと思っていたのですが、そのままジェネレートをして動かすとハードフォールトを起こします。

調べていくと、Cubeの設定でNVICの設定のところでチェックを入れないといけないことが判明しました。


スクリーンショット (125)

NVICのCode GenerationのタブのSelect for init seaquence ordering のところの目的の割り込みテーブルのところにチェックを入れます。(ここではDMA1)

スクリーンショット (126)

ここで、2種類の割り込みを選択したとすると、Rankをここで変更します。(要は割り込み優先度)


この操作をしてあげたうえでコードをジェネレートしてあげると

  MX_NVIC_Init();

という記述が追加され、割り込みが利用できるようになります。


あとはいつも通り割り込みのコードを書いて上げるだけです。

FreeRTOSでは、タスクを増やしてポーリングでUARTの受信待ちとかもできるのですが、デフォルトタスクがものすごい高速に回さないといけないとかどこかで重たい処理をさせてるなどの時には読み落としが生じてしまいます。このため割り込みをすることで回避することも十分できます。(いままでRTOSなんて使ってこなくて割り込みでゴリゴリ書いていたからこのやり方じゃないとしっくりこない上になんか嫌なんてことは言わない)けれど、FreeRTOSでやればそこまで周期の高くない一定間隔の処理とかはものすごく楽にできるようになったのでそこはいいかなぁとか思いつつやっています。(今まではベーシックタイマーの割り込みを使って書いてた)


というかDMAって終了コールバックに飛ぶだけの割り込みかかっちゃうからこれをやってあげないといけないんですよね。理論上だと何もしなくてもいいはずなんだけどここはCubeの作りがそうなってるから仕方ないかなという感じです。

簡単にですが今日はこの辺で。

アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

記事検索
ギャラリー
  • LWIPでPingを有効にする。
  • LWIPでPingを有効にする。
  • STM32CubeでFreeRTOSで割り込み処理をする
  • STM32CubeでFreeRTOSで割り込み処理をする
  • 18回レスコン電装部紹介
  • 18回レスコン電装部紹介
QRコード
QRコード