代码拉取完成,页面将自动刷新
#include <stdarg.h>
#include <slave.h>
typedef struct cal_lock{
int req, cur;
} cal_lock_t;
__attribute__((weak)) int cal_req_id = 0, cal_cur_id = 0;
static void cal_global_lock(){
int req, cur;
asm ("faaw %0, 0(%1)\n\t" : "=r"(req): "r"(&cal_req_id));
asm ("ldw %0, 0(%1)\n\t" : "=r"(cur): "r"(&cal_cur_id));
while (cur != req){
asm ("ldw %0, 0(%1)\n\t" : "=r"(cur): "r"(&cal_cur_id));
}
}
static void cal_global_unlock(){
asm ("faaw $31, 0(%0)\n\t" : : "r"(&cal_cur_id));
}
static void cal_lock(cal_lock_t *lock){
int req, cur;
asm ("faaw %0, 0(%1)\n\t" : "=r"(req): "r"(&(lock->req)));
asm ("ldw %0, 0(%1)\n\t" : "=r"(cur): "r"(&(lock->cur)));
while (cur != req){
asm("ldw %0, 0(%1)\n\t" : "=r"(cur): "r"(&(lock->cur)));
}
}
static void cal_unlock(cal_lock_t *lock){
asm ("faaw $31, 0(%0)\n\t" : : "r"(&(lock->cur)));
}
static void cal_locked_printf(char *fmt, ...){
volatile long vsprintf_addr = (long)vsprintf;
volatile long printf_addr = (long)printf;
int (*vsprintf_ptr)(char *, const char *, va_list) = (void*)vsprintf_addr;
int (*printf_ptr)(const char *, ...) = (void*)printf_addr;
char buf[256];
va_list va;
va_start(va, fmt);
vsprintf_ptr(buf, fmt, va);
va_end(va);
cal_global_lock();
fputs(buf, stdout);
fflush(stdout);
cal_global_unlock();
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。