자일링스 Zedboard를 사용하는 임베디드 시스템 프로젝트에서 작업하고 있습니다. 이 보드는 두 개의 별도 프로그램을 동시에 실행하기 위해 듀얼 코어 ARM A9 프로세서를 비대칭 적으로 분리 할 수 있습니다. 필자는 하나의 코어에서 Linux를 실행하고 다른 노드에서 베어 메탈 응용 프로그램을 하드웨어 컨트롤러로 작동하도록 보드를 구성했습니다. 프로세서 간 통신의 경우 두 프로세서간에 공유되는 칩 메모리를 활용합니다. 나는 자물쇠 구현에 어려움을 겪고 있으며, 누군가가 그러한 일을 경험하거나 올바른 방향으로 나를 가리킬 수 있는지 궁금합니다.ARM 어셈블리 인라인 C 뮤텍스 임펠 멘션
ARM 참조 웹 사이트 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0008a/ch01s03s02.html에서 뮤텍스 구현을 발견했으며이를 C 인라인 어셈블리에 적용했습니다. 테스트 후 잠금 기능이 멈춘 것처럼 보이고 이유가 없습니다. 어셈블리에 대한 나의 경험은 다소 제한적이며, 학교에서 보았으며 상위 개념을 이해했지만 저수준 구현에서는 완전히 잃어 버렸습니다.
이 모양이 맞습니까? 아니면 이것이 올바른 접근 방법입니까? 필요한 것은 인터 프로세스 통신 구조 (여러 메시지 대기열)에서 원자 연산을 수행 할 수있는 간단한 메커니즘입니다.
mutex.h
#ifndef __OCM_MUTEX_H__
#define __OCM_MUTEX_H__
#include <stdint.h>
#define LOCKED 1
#define UNLOCKED 0
typedef uint32_t mutex_t;
extern void ocm_lock_mutex(volatile mutex_t* mutex);
extern void ocm_unlock_mutex(volatile mutex_t* mutex);
#endif
mutex.c
#include "mutex.h"
void ocm_lock_mutex(volatile mutex_t* mutex) {
int result;
const uint32_t locked = LOCKED;
__asm__ __volatile__("@ocm_lock_mutex\n"
"1: LDREX %[r2], [%[r0]]\n"
" CMP %[r2], %[locked]\n"
" BEQ 2f\n"
" STREXNE %[r2], %[locked], [%[r0]]\n"
" CMP %[r2], #1\n"
" BEQ 1b\n"
" DMB\n"
" B 3f\n"
"2: WFE\n"
" B 1b\n"
"3: NOP\n"
: [r2] "=r" (result), [r0] "=r" (mutex)
: [locked] "r" (locked));
}
void ocm_unlock_mutex(volatile mutex_t* mutex) {
const uint32_t unlocked = UNLOCKED;
__asm__ __volatile__("@ocm_unlock_mutex\n"
" DMB\n"
" STR %[unlocked], [%[r0]]\n"
" DSB\n"
" SEV\n"
: [r0] "=r" (mutex)
: [unlocked] "r" (unlocked));
}
Linux에서 잠금 및 잠금 해제를 호출 할 때 세그먼테이션 오류가 발생하는 이유는 무엇입니까? – Wade
@Wade 나는 r1에 잘못된 것을 넣었다고 생각합니다. 나는 상수가 아닌 주소를로드해야한다. 나는 그것을 즉시 수정하려고 고칠 것이다. – auselen
@Wade는 내 이전 의견을 무시하고, 나는 그 의미에서 결함이 있다고 생각하지 않으며, 현재로서는 내 제안을 잘못했을 수 있다는 것을 알 수 없습니다. 단어의 유효한 주소 인 단일 매개 변수로 lock_mutex/unlock_mutex를 호출하고 있습니까? 'unsigned int와 비슷하다. output_mutex = unlocked; lock_mutex (& output_mutex);'제공 한 링크의 예와 같이? – auselen