WEAKシンボルについて

ここ最近ARM系のお勉強を頑張っています。


今日はWEAK修飾子についてです。
STを例に話すと割り込み後に呼ばれるコールバックってのがWEAKマクロを使って記述されてます。
定義先に行くと

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);

  /* NOTE : This function Should not be modified, when the callback is needed,
            the __HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */

}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	  //i2c_lcd_writeCommand(ClearDisplay);
	  i2c_lcd_writeCommand(ReturnHome);
	  HAL_Delay(2);
	  xprintf("Count:%d",count);
	  count++;
}


のように記述されている。

これをMainで呼び出すとこのように使う。



要は同じ関数が二個あったらWEAKがついてる側が譲るということである。
こうすることで関数の上書き的なことができる。これがないとmain文で定義しなければコンパイルエラーになってしまうのでこうやって回避しているわけである。


ちなみにI2C系のデバイスライブラリ作るときもI2Cの送信APIを上書きで定義できるようにすれば汎用性を持たせられるので便利

__weak void i2c_write(){
	//This Section  is User function
}
void i2c_write(){
	HAL_I2C_Master_Transmit(&hi2c1,addri2c,(uint8_t*)data,2,0xFF);
}

これでi2c_lcdの制御部分を記述してます。
1文字送信コマンドが2byteなのでこういった回りくどいことしてます。
f:id:gsmcustomeffects:20170603224309j:plain