일부 메모리 매핑 된 레지스터를 읽거나 쓰는 베어 메탈 프로그램 (드라이버)이 있습니다. 는 예컨대 :메모리 액세스 (MISRA 2008)
void foo_read(uint64_t reg_base, uint32_t *out_value)
{
*out = READREG(reg_base + FOO_REG_OFFSET);
}
- reg_base 메모리 매핑 장치 (64 비트 어드레스 )
- FOO_REG_OFFSET는 레지스터 (
#define FOO_REG_OFFSET 0x00000123
)의 오프셋의베이스 어드레스이다. 레지스터 "foo"는 32 비트 "와이드"입니다.
READREG는 다음과 같이 정의된다 :
#define READREG(address) (*(uint32_t*)(address))
는 MISRA 2008 포인터 (5-2-7/5-2-8은 긴 긴 부호에서 캐스트와 함께 행복하지 않다 추측 수 있듯이 보고 됨). 내 질문은 : 메모리에 액세스하고 MISRA 경고를 없애기위한 최선의/적절한 방법은 무엇입니까? 포인터로 캐스팅하기 전에 uintptr_t로 캐스팅하려고 시도했지만 This didn't help입니다.
감사합니다.
오히려 분명한 질문이다. reg_base' 실제로 포인터입니다, 왜'uint8_t *'로 입력하지? – hidefromkgb
@hidefromkgb : 또는'uint32_t *','reg_base'가 정말로 정수 일 필요가 있다면'uintptr_t'보다는'uint64_t'를 사용해야하는 이유는 무엇입니까? (MISRA는 그것도 좋아하지 않을 것이다. 그러나'intptr_t' 나'uintptr_t'는 포인터 값을 가지고있는 정수에서 가장 논리적 인 타입이다.) –
@KeithThompson, wouldn \'t'uint32_t *'는 FOO_REG_OFFSET에 4를 곱한다. 'reg_base'에 추가 하시겠습니까? – hidefromkgb