LoginSignup
2
1

TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介(4)第三回アプリケーション開発部門銅賞 lwIP の移植 松浦 光洋(個人)

Last updated at Posted at 2018-06-20

TOPPERS「活用アイデア」・「アプリケーション開発」コンテスト
は、2011年から毎年実施されています。
https://www.toppers.jp/contest.html

「アプケーション開発」は、ソースコードの公開を前提としています。
「活用アイデア」でも、その後実現したソースコードなどもある。探しながら紹介。

なお、この記事は、TOPPERSプロジェクトの公式見解ではなく、
小川清 の 技術者個人の考えに基づいています。

目的(purpose)

TOPPERS開発アイデア・アプリケーション開発コンテスト受賞作品には、良質な算譜、技術的に崇高な志向、目的を達成するための意思などが感じられる。広く、source codeを表示して紹介し、次の応募作品を促す。
#成果(outcome)
応募作品の算譜を眺めると、その技術者の得意分野や技法を感じることができる。応募作品のソースコードを使ってみようという気になる。ソースコードを一度コンパイルしたくなる。自分も良い作品を作ろうという気になる。

TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介(4) 第三回アプリケーション開発部門(2013)銅賞

lwIP の移植 松浦 光洋(個人)

応募資料(application material)等

コンテスト応募資料
https://www.toppers.jp/docs/contest/2013/matsuura.pdf

ET2013発表資料
https://www.toppers.jp/docs/contest/2013/mmatsu_presen_2013.pdf
###Download
ソースコード
https://www.toppers.jp/docs/contest/2013/matsuura_src.zip

関連資料(related URL)

lwip移植の内容:書籍に収録
「全部ネット接続!Ethernetマイコン・プログラミング」
http://shop.cqpub.co.jp/hanbai/books/49/49791.html

lwIPをTOPPERS/ASPに移植: 松浦光洋の研究開発
http://matuura.cocolog-nifty.com/blog/2013/11/lwiptoppersasp-.html

STM32F429ボードにLWIP
http://matuura.cocolog-nifty.com/blog/2013/01/lwip-cdbb.html

算譜(source code)

./src/lwip/dynamic/sys_arch.c
#include <string.h>
#include <kernel.h>
#include "kernel_cfg.h"
#if 1
#include "debug.h"
#else
#ifdef USE_DEBUG_PRINTF
#undef USE_DEBUG_PRINTF
#endif
#define printf(...)
#endif

#include "arch/sys_arch.h"

#include "lwip/opt.h"
#include "lwip/debug.h"
#include "lwip/def.h"
#include "lwip/sys.h"
#include "lwip/mem.h"
#include "lwip/stats.h"

void sys_init(void)
{
	return;
}

err_t sys_sem_new(sys_sem_t *sem, u8_t count)
{
	err_t ret = ERR_VAL;

	printf("sys_sem_new in\n");
	if(NULL != sem)
	{
		T_CSEM csem = { TA_TPRI, (uint_t)count, (uint_t)1 };
		ID id = acre_sem(&csem);
		if(0 < id)
		{
			*sem = id;
			ret = ERR_OK;
			printf("sys_sem_new out %d, %d\n", *sem, count);
		}
		else
		{
			*sem = (sys_sem_t)NULL;
			printf("sys_sem_new out ERROR!\n");
		}
	}
	return ret;
}

void sys_sem_free(sys_sem_t *sem)
{
	printf("sys_sem_free in %d\n", *sem);
	del_sem(*sem);
	*sem = (sys_sem_t)NULL;
	printf("sys_sem_free out\n");
	return;
}

void sys_sem_signal(sys_sem_t *sem)
{
	printf("sys_sem_signal in %d\n", *sem);
	sig_sem(*sem);
	printf("sys_sem_signal out %d\n", *sem);
	return;
}

u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
{
	SYSTIM systim0, systim1;
	ER ercd;

	get_tim(&systim0);
	printf("sys_arch_sem_wait in %d\n", *sem);
	if(timeout)
	{
		ercd = twai_sem(*sem, (TMO)timeout);
	}
	else
	{
		ercd = wai_sem(*sem);
	}

	if(E_OK == ercd)
	{
		get_tim(&systim1);
		printf("sys_arch_sem_wait out %d, E_OK\n", *sem);
		return (u32_t)(systim1 - systim0);
	}
	printf("sys_arch_sem_wait out %d, SYS_ARCH_TIMEOUT\n", *sem);
	return SYS_ARCH_TIMEOUT;
}

err_t sys_mbox_new(sys_mbox_t *mbox, int size)
{
	err_t ret = ERR_VAL;

	printf("sys_mbox_new in\n");
	if(NULL != mbox)
	{
		T_CDTQ cdtq = { TA_NULL, (uint_t)size, (void *)NULL };
		ID id = acre_dtq(&cdtq);
		if(0 < id)
		{
			*mbox = id;
			ret = ERR_OK;
			printf("sys_mbox_new out %d, %d\n", *mbox, size);
		}
		else
		{
			*mbox = (sys_mbox_t)NULL;
			printf("sys_mbox_new out ERROR!\n");
		}
	}
	return ret;
}

void sys_mbox_free(sys_mbox_t *mbox)
{
	printf("sys_mbox_free in %d\n", *mbox);
	del_dtq(*mbox);
	*mbox = (sys_mbox_t)NULL;
	printf("sys_mbox_free out\n");
	return;
}

void sys_mbox_post(sys_mbox_t *mbox, void *msg)
{
	printf("sys_mbox_post in %d, 0x%08x\n", *mbox, msg);
	snd_dtq(*mbox, (intptr_t)msg);
	printf("sys_mbox_post out %d, 0x%08x\n", *mbox, msg);
	return;
}

err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
{
	err_t ret = ERR_VAL;

	printf("sys_mbox_trypost in %d, 0x%08x\n", *mbox, msg);
	if(E_OK == psnd_dtq(*mbox, (intptr_t)msg))
	{
		ret = ERR_OK;
	}
	printf("sys_mbox_trypost out %d, 0x%08x %d\n", *mbox, msg, ret);
	return ret;
}

u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
{
	SYSTIM systim0, systim1;
	ER ercd;

	get_tim(&systim0);
	printf("sys_arch_mbox_fetch in %d\n", *mbox);
	if(timeout)
	{
		ercd = trcv_dtq(*mbox, (intptr_t *)msg, timeout);
	}
	else
	{
		ercd = rcv_dtq(*mbox, (intptr_t*)msg);
	}

	if(E_OK == ercd)
	{
		get_tim(&systim1);
		printf("sys_arch_mbox_fetch out %d, E_OK\n", *mbox);
		return (u32_t)(systim1 - systim0);
	}
	printf("sys_arch_mbox_fetch out %d, SYS_ARCH_TIMEOUT\n", *mbox);
	return SYS_ARCH_TIMEOUT;
}

u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
{
	printf("sys_arch_mbox_tryfetch in %d\n", *mbox);
	if(E_OK == prcv_dtq(*mbox, (intptr_t *)msg))
	{
		printf("sys_arch_mbox_tryfetch out %d, 0x%08x, ERR_OK\n", *mbox, *msg);
		return (u32_t)ERR_OK;
	}
	printf("sys_arch_mbox_tryfetch out %d, SYS_MBOX_EMPTY\n", *mbox);
	return SYS_MBOX_EMPTY;
}

sys_thread_t sys_thread_new(const char *name, void(*thread)(void *), void *arg, int stacksize, int prio)
{
	printf("sys_thread_new in\n");

	T_CTSK ctsk = { TA_ACT, (intptr_t)arg, (TASK)thread, (PRI)prio, (SIZE)stacksize, (STK_T *)NULL };
	ID id = acre_tsk(&ctsk);

	printf("sys_thread_new %s, %d, %d, %d\n", name, stacksize, prio, id);
	return (sys_thread_t)id;
}

sys_prot_t sys_arch_protect(void)
{
	bool_t state = sns_loc();
	if(!state)
	{
		loc_cpu();
	}
	return (sys_prot_t)(~state);
}

void sys_arch_unprotect(sys_prot_t pval)
{
	if(pval)
	{
		unl_cpu();
	}
	return;
}

u32_t sys_now(void)
{
	SYSTIM systim;

	get_tim(&systim);
	return (u32_t)systim;
}

最新のソフトウェアへの対応には、上記書籍が参考になる。

参考資料(reference)

TOPPERS活用アイデア・アプリケーション開発コンテストを振り返る
https://researchmap.jp/joxkbxlck-1778110/
「応募すると何が嬉しい」TOPPERS活用アイデア・ アプリケーション開発コンテスト
https://www.slideshare.net/kaizenjapan/ss-78528931

「TOPPERS活用アイデア・アプリケーション開発コンテスト」への道
https://researchmap.jp/jovr40j3b-1778110/?block_id=1778110&active_action=journal_view_main_detail&post_id=38687&comment_flag=1

文書履歴(document history)

ver. 0.10 初稿 20180620

最後までおよみいただきありがとうございました。

いいね 💚、フォローをお願いします。

Thank you very much for reading to the last sentence.

Please press the like icon 💚 and follow me for your happy life.

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1