目次: FreeRTOS
FreeRTOSへ送ったPull Requestにレビューコメントが来ました。確かPull Requestは9/14に送ったので1か月半くらい経ってます。FreeRTOSはのんびり屋さんですね。
あまりにも昔なので、送ったことを忘れかけていましたが、せっかくレビューしていただきましたし、内容を思い出しつつ、指摘事項を全て修正して再送しました。
ただ残念ながらFreeRTOSはSMPに対応していないのがわかったときから、あんまり興味がなくなっちゃったんですよね……。
世の中にはSMP対応の派生コード(Xtensa用 by Cadence, Tensilica)、SMPではないマルチコア対応の派生コード(Kendryte用 by Canaan Inc.)もありますが、本家がマルチコア化に全く手を出していないところを見ると、FreeRTOSは質素が売りなんでしょうね。
この記事にコメントする
目次: ARM
ROCKPro64でI2S0を無効にすると、なぜか無関係なはずのアナログオーディオ(I2S1)が鳴らなくなる、謎の挙動を示します。原因を調べてみると搭載SoCであるRockchip RK3399の不思議な設計が原因でした。
I2Sは大まかにいうと4種類の信号を使います。
RK3399の仕様をみるとMCLKの出力(RK3399のピン名だとI2S_CLK)をI2S0とI2S1で共用しています。普通、MCLKはI2Sに流す信号によって周波数が変わりますから、共用はしません。できる場合もありますが限定的です。
I2Sのハードとしては性能は等価に見えます。ただしSoCのピン設定の仕様を見る限りでは、I2S0は8ch出力まで可能、I2S1は2ch出力のみ可能です。
I2S0はRaspberryPi互換ピンヘッダに出力されていますが、MCLKは出力されていない不思議な構成です。MCLKがなくても動くDACはあるのでしょうか……?
I2S1はEverest ES8316というDACに接続され、アナログオーディオIn/Outを実現しています。I2S_CLKはI2S1用、つまりES8316のMCLKに接続されています。
ROCKPro64の仕様としては、I2S0は遊ばせていて、I2S1はアナログオーディオ用に接続している、と考えれば、特に違和感はない構成です。
Device Treeを見ると、I2S_CLKはI2S0の有効、無効の設定に連動して、出力ピンが制御されるように実装されています。
しかし先ほども言った通りROCKPro64の場合は、I2S_CLKはI2S1のために使われているので、この設定はボードの配線と合っていません。
直し方としては、I2S_CLKをI2S0に連動させる設定(既に存在する)に加えて、I2S_CLKをI2S1に連動させる設定を加えて、ボード側でピン設定を選ぶようにすると直せそうです。Device Tree内のピン設定がやたら増えるのは難点ですが、RK3399の仕様に由来するので仕方ないですね。
この記事にコメントする
Twitterでこんな問題(リンク)を見かけたので、やってみました。緑色の図形の面積を求めよ、という問題です。
算数で解く=方程式やルートを使わない、という意味だと理解し、図形の合同性だけで解いてみます。
こんな感じで答えは4です。小学生にも解ける問題といえばそうなんでしょうけど、自分が小学生だったころに解けただろうか、と考えるとどうだろうね?
この記事にコメントする
目次: ARM
ROCK64ブート周りの話のまとめ。
ROCK64オーディオ周りの話のまとめ。
ROCKPro64シリアル文字化けの話のまとめ。
ROCKPro64オーディオの話のまとめ。
ROCKPro64のその他の話のまとめ。
ROCK 3C/ROCK 5Bの話。
ARM関連の話。
目次: 一覧の一覧
この記事にコメントする
【速報】テスラ「バッテリー・デー」のポイントを解説 - EVsmartブログ を読んで。
約1か月前のニュースですが「電池は自分で作るんで!さよなら!!」と鮮やかにポイ捨てされたパナソニックさん。
一緒に5000億の工場(ギガファクトリー1)を作り始めた(※1)かと思いきや、投資回収どころか、工場完成してないのに縁切り宣言を始める辺り、テスラは気が短すぎます。この決断スピードには、パナソニックはとても付いていけないでしょう。
今だから思いますが、ギガファクトリー1はうまく(?)できていて、セル:パナソニック、アセンブリ:テスラの分担となっていますので、テスラは離脱してもほぼ損害がありません。テスラは最初からバッテリー自社生産を狙っていたのでは?とすら感じます。
いずれにせよ困るのはパナソニックで、テスラに離脱されると、大量の2170セル生産能力が余ります(※2)。18650に転換してもテスラ並みの需要を持つ顧客はいるでしょうか?
(※1)ギガファクトリー1は合弁で建てているので、パナソニックとテスラの負担割合はわかりません。さすがにゼロってことはないでしょう。
(※2)ギガファクトリー1は、テスラ専用の2170(直径21mm x高さ70mm)という微妙にでかいバッテリーセルを作っており、標準的な18650(18mm x 65.0mm)セル使う機器には使いまわし効かないように見えます。
5年位前にギガファクトリー1のニュースを見たときは「テスラと組むなんて、パナソニックも変わったなあ〜」なんて感動しました。パナソニックの社運を賭けた投資、なんてニュースも目にしたものです。
ぼーっとしているとテスラに置いて行かれ、数年後にはギガファクトリー1が、パナソニックの大型失敗案件、砺波CCD(1000億)、尼崎プラズマ(4000億?)、三洋合併(6000億円?)にランクインしてしまいそうです。
完全にテスラに寄りかかって、何も考えてないパナソニックが悪い、ダシにされて当然だろ?っていわれたら、何も言い返せないですが、さすがに合弁作ってハイさようならは、ご無体すぎて可哀想ですね……。
メモ: 技術系の話はFacebookから転記しておくことにした。加筆修正。
この記事にコメントする
目次: Zephyr
前回はリグレッションテストの実行環境を整備しました。今回はリグレッションテストで見つけたバグを修正します。
テストtests/kernel/smp/kernel.multiprocessing.smpが失敗しています。
ASSERTION FAIL [!arch_is_in_isr()] @ ZEPHYR_BASE/kernel/sched.c:1209
テスト対象のarch_is_in_isr() の実装を見ると、シングルコアを前提とした実装になっています。
// zephyr/arch/riscv/include/kernel_arch_func.h
static inline bool arch_is_in_isr(void)
{
return _kernel.cpus[0].nested != 0U; //★シングルコア前提になっている★
}
// (修正後)
static inline bool arch_is_in_isr(void)
{
return arch_curr_cpu()->nested != 0U;
}
直し方はarch_curr_cpu() に置き換えるだけで良さそうです。
他のテストではsched_ipi_has_calledが0のままらしく、怒られています。
Assertion failed at ZEPHYR_BASE/tests/kernel/smp/src/main.c:602: test_smp_ipi: (sched_ipi_has_called != 0 is false)
テスト対象のsched_ipi_has_calledをカウントアップする処理は下記のとおりです。
// zephyr/kernel/sched.c
#ifdef CONFIG_SMP
void z_sched_ipi(void)
{
/* NOTE: When adding code to this, make sure this is called
* at appropriate location when !CONFIG_SCHED_IPI_SUPPORTED.
*/
#ifdef CONFIG_TRACE_SCHED_IPI
z_trace_sched_ipi();
#endif
}
// zephyr/tests/kernel/smp/src/main.c
#ifdef CONFIG_TRACE_SCHED_IPI
/* global variable for testing send IPI */
static volatile int sched_ipi_has_called;
void z_trace_sched_ipi(void)
{
sched_ipi_has_called++;
}
コンフィグCONFIG_TRACE_SCHED_IPIが有効になっているときは、カーネルがz_trace_sched_ipi() を呼び出します。テストではCONFIG_TRACE_SCHED_IPIを有効にするとともに、この関数を定義して、カーネルから正常にコールバックされるかどうかを見ているようです。
以前(2020年10月16日の日記参照)、IPIのハンドラを実装した際にコメントアウトしてくれ、と言っていた部分がありました。あの部分が役に立ちます。
// zephyr/drivers/timer/riscv_machine_timer.c
#ifdef CONFIG_SMP
void z_riscv_sched_ipi(void);
static void soft_isr(const void *arg)
{
volatile uint32_t *r = (uint32_t *)RISCV_MSIP;
ARG_UNUSED(arg);
*r = 0;
z_riscv_sched_ipi(); //★この行を足す★
}
#endif
// zephyr/arch/riscv/core/cpu_smp.c
#ifdef CONFIG_SMP
void z_riscv_sched_ipi(void)
{
z_sched_ipi();
}
#endif
本当は直接z_sched_ipi() を呼べば良いんですが、drivers以下のソースコードからはz_sched_ipi() を呼ばない方が良さそう(関数プロトタイプが見えない)だったので、arch/riscvを経由させる変な実装になっています。どう実装するのが正しいんでしょうねえ?
これでSMP系のテストを通過しました。良かった良かった。
この記事にコメントする
| < | 2020 | > | ||||
| << | < | 10 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| - | - | - | - | 1 | 2 | 3 |
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
25年10月15日
25年10月18日
22年5月5日
25年10月19日
23年4月11日
06年4月22日
25年10月17日
25年10月6日
25年10月13日
20年10月23日
25年10月12日
20年8月29日
19年1月13日
18年10月13日
18年9月3日
18年8月20日
18年7月23日
18年7月22日
18年10月14日
18年11月10日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: