Một số để biết sau khi một số tìm kiếm:.
" ARM Cortex-M3-bit dải lõi vi điều khiển ARM cung cấp một cách khác để thực hiện Cột Viết tiếp cận với các biến trong khu vực chút băng tần bí danh gây một nguyên tử đọc-sửa đổi – ghi quyền truy cập vào vị trí bộ nhớ trong vùng dải bit ở mức bus hệ thống Biến đổi trong vùng bit-band có thể dùng làm vùng chứa cho các semaphores. Bất cứ khi nào một khách hàng cần phải yêu cầu semaphore, nó đặt bit của riêng nó bằng cách viết 1 đến vị trí tương ứng trong vùng bí danh dải bit. d kiểm tra xem không có bit nào khác được đặt, nghĩa là khách hàng đã xác nhận thành công semaphore. Trong trường hợp các bit khác được thiết lập, client sẽ phải xóa bit của chính nó một lần nữa, và thử lại (có lẽ sau khi chờ đợi). " (source)
Đây là thô của tôi (chưa được kiểm tra) giải thích:
/*
* Frees a lock.
*
* @note lock must point to a fully aligned 32 bit integer.
* (atomically set to 0)
*
* @returns 1 if successfull
*/
int rwl_FreeLock(volatile uint32_t *lock){
*lock = 0;
return 1; // always successful
}
/*
* Attempts to acquire a lock
* @param who is the client taking the lock
* @lock pointer to the mutex (uint32_t value in memory)
* @note lock must point to a fully aligned 32 bit integer.
* (atomically set to 1 only if set to 0)
*/
int rwl_TryLock(volatile uint32_t *lock, int who){
// initial check of lock
if(*lock == 0){
Var_SetBit_BB((uint32_t)lock, who);
if(*lock == (1<<who)){ // check that we still have exclusive access
// got the lock!
return 1;
} else {
// do not have the lock
Var_ResetBit_BB((uint32_t)lock, who); // clear the lock flag
return 0;
}
}
}
Var_Set_BB/Var_Reset_BB:. Thiết lập/rõ ràng một chút chút bằng dải (nguyên tử)
Tuy nhiên, nó không không hoạt động !!!
Nếu hai điều cố gắng truy cập vào khóa, nó sẽ có vẻ như cả hai truy cập có thể báo cáo thất bại . Một cách tiếp cận tốt hơn là sử dụng spinloop ldrex/strex. Điều đó đã được nói, ở mức độ nào mà các truy cập bit-band đảm bảo nguyên tử trong sự hiện diện của những thứ như DMA và như vậy? Nếu việc ghi DMA và ghi băng bit xảy ra gần như đồng thời, thì ghi DMA có đảm bảo không xảy ra giữa các khía cạnh 'đọc' và 'ghi' của bit-band viết không? – supercat