1 #include <common/glib.h> 2 #include <common/string.h> 3 4 /** 5 * @brief 这个函数让蜂鸣器发声,目前仅用于真机调试。未来将移除,请勿依赖此函数。 6 * 7 * @param times 发声循环多少遍 8 */ 9 void __experimental_beep(uint64_t times) 10 { 11 io_out8(0x43, 182&0xff); 12 io_out8(0x42, 2280&0xff); 13 io_out8(0x42, (2280>>8)&0xff); 14 uint32_t x = io_in8(0x61)&0xff; 15 x |= 3; 16 io_out8(0x61, x&0xff); 17 18 times *= 10000; 19 for(uint64_t i=0;i<times;++i) 20 pause(); 21 x = io_in8(0x61); 22 x &= 0xfc; 23 io_out8(0x61, x&0xff); 24 25 // 延迟一段时间 26 for(uint64_t i=0;i<times;++i) 27 pause(); 28 } 29 30 /** 31 * @brief 将数据从src搬运到dst,并能正确处理地址重叠的问题 32 * 33 * @param dst 目标地址指针 34 * @param src 源地址指针 35 * @param size 大小 36 * @return void* 指向目标地址的指针 37 */ 38 void *memmove(void *dst, const void *src, uint64_t size) 39 { 40 const char *_src = src; 41 char *_dst = dst; 42 43 if (!size) 44 return dst; 45 46 // 当源地址大于目标地址时,使用memcpy来完成 47 if (dst <= src) 48 return memcpy(dst, src, size); 49 50 // 当源地址小于目标地址时,为防止重叠覆盖,因此从后往前拷贝 51 _src += size; 52 _dst += size; 53 54 // 逐字节拷贝 55 while (size--) 56 *--_dst = *--_src; 57 58 return dst; 59 }