定位之谜2

可以定位数据 但是函数貌似不行 有问题

转变一下

void func (void)
{
	printf("HELLO");
}

typedef struct _component_init {
    char     *name;
    void      (*fun)( void);
}component_init;

component_init A __attribute__((at(0x20000000))) =  {"HELLO", func};

改变函数为数据!!!

如上可以!!

SRAM中放的地址 和 函数本身的地址 相差1 (暂时认为相当吧)

func();
A.fun();

基本可以判断一个这样的结构体需要8个HEX

 

 

嗨一下

__packed typedef struct _component_init {
	  char       id;
    void      (*fun)( void);
}component_init;

component_init A __attribute__((at(0x20000000))) =  {1, func};

看到这里 节约!!!

注意必须要__packed 否则char不是1  它不对齐 也是4

 

继续:

#define MODULE_DEVICE_TABLE(fun)					    \
   component_init  __mod_##fun  \
  __attribute__((at(0x20000000)))={COUNT++,fun};

此时必须放在函数内部!

void StartDefaultTask(void const * argument)
{MODULE_DEVICE_TABLE(func)    ;

如果

MODULE_DEVICE_TABLE(func)    ;
void StartDefaultTask(void const * argument)
{

就会:../Src/freertos.c(246): error:  #57: this operator is not allowed in a constant expression

 

 

继续:

放弃了 太麻烦

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值