(toppers-users 4717) TOPPERS/ASP3 L1キャッシュについて
kaneko-nao
kaneko-nao @ numata.co.jp
2018年 1月 5日 (金) 10:59:41 JST
名古屋大学
高田広章 様
毎々お世話になります。株式会社ヌマタです。
現在、別件(フリーズの件)でお世話になっていますが、こちらは別案件です。唯、関係しているのかも知れませんので、投稿させていただきます。
弊社では、設計当初、OSにRTXを使用していたのですが、途中からTOPPERS/ASP3に移行しました。
その際、同じプログラムがTOPPERS上では異常に遅かったため調べたところ、L1キャッシュが効いていないのではないかと考え、下記の変更をしています。
1)arm.c - arm_disable_dcache(void) を以下に置き換え
.text
.global __v7_all_cache
//#pragma push
//#pragma arm
//__STATIC_ASM void __v7_all_cache(uint32_t op) {
__v7_all_cache:
.arm
PUSH {R4-R11}
MRC p15, 1, R6, c0, c0, 1 // Read CLIDR
ANDS R3, R6, #0x07000000 // Extract coherency level
MOV R3, R3, LSR #23 // Total cache levels << 1
BEQ Finished // If 0, no need to clean
MOV R10, #0 // R10 holds current cache level
<< 1
Loop1: ADD R2, R10, R10, LSR #1 // R2 holds cache "Set" position
MOV R1, R6, LSR R2 // Bottom 3 bits are the
Cache-type for this level
AND R1, R1, #7 // Isolate those lower 3 bits
CMP R1, #2
BLT Skip // No cache or only instruction
cache at this level
MCR p15, 2, R10, c0, c0, 0 // Write the Cache Size selection
register
ISB // ISB to sync the change to the
CacheSizeID reg
MRC p15, 1, R1, c0, c0, 0 // Reads current Cache Size ID
register
AND R2, R1, #7 // Extract the line length field
ADD R2, R2, #4 // Add 4 for the line length
offset (log2 16 bytes)
LDR R4, =0x3FF
ANDS R4, R4, R1, LSR #3 // R4 is the max number on the
way size (right aligned)
CLZ R5, R4 // R5 is the bit position of the
way size increment
LDR R7, =0x7FFF
ANDS R7, R7, R1, LSR #13 // R7 is the max number of the
index size (right aligned)
Loop2: MOV R9, R4 // R9 working copy of the max way
size (right aligned)
Loop3: ORR R11, R10, R9, LSL R5 // Factor in the Way number and
cache number into R11
ORR R11, R11, R7, LSL R2 // Factor in the Set number
CMP R0, #0
BNE Dccsw
MCR p15, 0, R11, c7, c6, 2 // DCISW. Invalidate by Set/Way
B cont
Dccsw: CMP R0, #1
BNE Dccisw
MCR p15, 0, R11, c7, c10, 2 // DCCSW. Clean by Set/Way
B cont
Dccisw: MCR p15, 0, R11, c7, c14, 2 // DCCISW, Clean and Invalidate
by Set/Way
cont: SUBS R9, R9, #1 // Decrement the Way number
BGE Loop3
SUBS R7, R7, #1 // Decrement the Set number
BGE Loop2
Skip: ADD R10, R10, #2 // increment the cache number
CMP R3, R10
BGT Loop1
Finished:
DSB
POP {R4-R11}
BX lr
//}
//#pragma pop
.END
2)target_kernel_impl.cのMMUへの設定属性(第1レベルディスクリプタ)を変更
#define MMU_ATTR_IODEV 0x00000c12 // ストロングリオーダーメモリ
#define MMU_ATTR_RAM 0x00085c06 // 内蔵RAM
以上です。よろしくお願いいたします。
株式会社ヌマタ