硬盘一个巧妙的设计
不要用1234这样的数值 而是一个一个的位
这样的好处?比如1234你需要擦除2个的话需要2个函数
没有说到点子上 位的话 也是要去执行2个函数 区别是位 一个一个清的 不是一下子到0
硬盘分区设计-
1获得华邦的型号比如是8M的
比如我现在分为1M一个盘符那就是有8个空间需要控制了
比如名字都是SPIFLASH12345678这样的
我每个对应一个位也就是U8可以控制好
我现在执行擦除
1暴力的可以调用一个全部擦除
2分开的话我在一个死循环里面定一个U8通过函数接口把U8分享出去
接口外面可以给U8的某一个位写1 而我的死循环就一直在问U8是不是0
如果不是0说明外面接口给他拉1了 那个位是1我就去擦对应的盘符然后U8的这个位清0
所以外面可以同时拉多个位是1
我以前的传统思路是做一个/8外面写123然后我死循环里面U8为0 这样就不能同时擦多个盘符
代码:
#include "gflashctl.h"
typedef union _memctl
{
struct
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
} bflag;
unsigned char flag;
}memctl;
memctl gflash;
//外部接口
void set_flash_clearp1(void){gflash.bflag.bit0=1;};
void set_flash_clearp2(void){gflash.bflag.bit1=1;};
void set_flash_clearp3(void){gflash.bflag.bit2=1;};
void set_flash_clearp4(void){gflash.bflag.bit3=1;};
void set_flash_clearp5(void){gflash.bflag.bit4=1;};
void set_flash_clearp6(void){gflash.bflag.bit5=1;};
void set_flash_clearp7(void){gflash.bflag.bit6=1;};
void set_flash_clearp8(void){gflash.bflag.bit7=1;};
//内部放在死循环 异步
void memctl_loop(void)
{
if(gflash.flag==0)
return;
if(gflash.bflag.bit0)
{
gflash.bflag.bit0=0;
flash_clear(p1);
}
if(gflash.bflag.bit1)
{
gflash.bflag.bit1=0;
flash_clear(p2);
}
if(gflash.bflag.bit2)
{
gflash.bflag.bit2=0;
flash_clear(p3);
}
if(gflash.bflag.bit3)
{
gflash.bflag.bit3=0;
flash_clear(p4);
}
if(gflash.bflag.bit4)
{
gflash.bflag.bit4=0;
flash_clear(p5);
}
if(gflash.bflag.bit5)
{
gflash.bflag.bit5=0;
flash_clear(p6);
}
if(gflash.bflag.bit6)
{
gflash.bflag.bit6=0;
flash_clear(p7);
}
if(gflash.bflag.bit7)
{
gflash.bflag.bit7=0;
flash_clear(p8);
}
}
可以看到 比较冗余
我需要1一个初始化 把全局变量=0 2我每个位的处理函数是传入一个W24Q64的地址 这样其实
深入理解前面 最强串口 我传入的是一个函数 说道点子 是 注册技术!
我也用注册技术!
类似如下
#include "gflashctl.h"
typedef void (*_callback) (uint32_t);
typedef union _memctl
{
struct
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
} bflag;
unsigned char flag;
_callback callback[8];
}memctl;
memctl gflash;
//外部接口
void set_flash_clearp1(void){gflash.bflag.bit0=1;};
void set_flash_clearp2(void){gflash.bflag.bit1=1;};
void set_flash_clearp3(void){gflash.bflag.bit2=1;};
void set_flash_clearp4(void){gflash.bflag.bit3=1;};
void set_flash_clearp5(void){gflash.bflag.bit4=1;};
void set_flash_clearp6(void){gflash.bflag.bit5=1;};
void set_flash_clearp7(void){gflash.bflag.bit6=1;};
void set_flash_clearp8(void){gflash.bflag.bit7=1;};
//内部放在死循环 异步
void memctl_loop(void)
{
if(gflash.flag==0)
return;
if(gflash.bflag.bit0)
{
gflash.callback[0]();
}
if(gflash.bflag.bit1)
{
gflash.callback[1]();
}
if(gflash.bflag.bit2)
{
gflash.callback[2]();
}
if(gflash.bflag.bit3)
{
gflash.callback[3]();
}
if(gflash.bflag.bit4)
{
gflash.callback[4]();
}
if(gflash.bflag.bit5)
{
gflash.callback[5]();
}
if(gflash.bflag.bit6)
{
gflash.callback[6]();
}
if(gflash.bflag.bit7)
{
gflash.callback[7]();
}
}
void flash_clear_0(u32 add)
{flashclesr(add);gflash.bflag.bit0=0;}
void memctl_init(void)
{
gflash.flag=0;
callback[0]=flash_clear_0;
callback[1]=flash_clear_1;
callback[2]=flash_clear_2;
callback[3]=flash_clear_3;
callback[4]=flash_clear_4;
callback[5]=flash_clear_5;
callback[6]=flash_clear_6;
callback[7]=flash_clear_7;
}
现在看上去 void memctl_loop(void) 还是冗余
看看
for(unsigned char i=1;i;i = i<<1)
printf("%02X ",i);
这样位 移动就是8个
截取一下
这样可以把拉的位 表现出来
完成清位模型:
int main(int argc,char **argv)
{
unsigned char flag=0X18;
printf("---%02X\r\n",flag);
for(unsigned char i=1;i;i = i<<1)
{
if( (i & flag) == i)
{
printf("%02X ",i);
flag = flag & (~i);
}
}
printf("\r\n---%02X ",flag);
return 1;
}
继续完美自己的模型:
#include "gflashctl.h"
typedef void (*_callback) (uint32_t);
typedef union _memctl
{
struct
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
} bflag;
unsigned char flag;
_callback callback;
}memctl;
memctl gflash;
//外部接口
void set_flash_clearp1(void){gflash.bflag.bit0=1;};
void set_flash_clearp2(void){gflash.bflag.bit1=1;};
void set_flash_clearp3(void){gflash.bflag.bit2=1;};
void set_flash_clearp4(void){gflash.bflag.bit3=1;};
void set_flash_clearp5(void){gflash.bflag.bit4=1;};
void set_flash_clearp6(void){gflash.bflag.bit5=1;};
void set_flash_clearp7(void){gflash.bflag.bit6=1;};
void set_flash_clearp8(void){gflash.bflag.bit7=1;};
//内部放在死循环 异步
void memctl_loop(void)
{
if(gflash.flag==0)
return;
for(unsigned char i=1;i;i = i<<1)
{
if( (i & gflash.flag) == i)
gflash.callback(i);//这样最好 这个函数1清除对应的位 2去格式化对应的硬盘
}
}
void flash_clear_bit_clear(u8 i)
{
flashclesr(add);//清除对应的盘符做一个switch case
gflash.flag = gflash.flag & (~i);;//清除bit
}
void memctl_init(void)
{
gflash.flag=0;
callback =flash_clear_0;
}